Функция хеширования столкновений

Привет всем, у меня большая проблема с моей хеш-функцией. Я пытаюсь объяснить свою проблему:

У меня есть набор символов, и я хочу выполнить хэш-функцию, потому что я хочу изменить набор с помощью набора хешей, для каждого символа у меня есть индекс, поэтому что я делаю сейчас:

пара -> index p = 1 index a = 2 index i = 3 index r = 4 ---> поэтому мой хэш возвращает 1234

но если, например, у меня есть

так -> индекс s = 12 индекс o = 34 ---> хэш 1234

Столкновение !!!!

P.S. : Я не могу заказать свой символ по буквенному номеру ....

Итак, есть ли кто-нибудь, кто может мне помочь ?? БОЛЬШОЕ СПАСИБО :)


person Leonardo Rania    schedule 17.04.2013    source источник
comment
Вот почему вы не должны создавать свой собственный хеш. Что плохого в использовании уже широко используемых, таких как md5 / sha1?   -  person Marc B    schedule 17.04.2013
comment
Обычно символы умножаются на несколько хороших выбранных чисел, которые часто подвергаются XOR, но вы ничего подобного не делаете ... Обычно нескольким математическим экспертам требуется месяц, чтобы разработать алгоритм хеширования.   -  person rekire    schedule 17.04.2013
comment
Потому что у меня есть целые числа в моем наборе, и если мне нужно сделать to_string, а затем передать значение в md5 / sha1, это слишком дорого :(   -  person Leonardo Rania    schedule 17.04.2013
comment
Создание хэша дороже конвертации. В зависимости от вашей структуры данных вы можете просто хешировать память своей структуры. Так что конвертировать ничего не нужно.   -  person rekire    schedule 17.04.2013
comment
Нет, не поверьте ... построение хеша дороже только для мозга :) Пробовал использовать md5 / sha1 / superFast ...   -  person Leonardo Rania    schedule 17.04.2013
comment
Попробуйте повернуть бит вместе с XOR следующего байта. Это приведет к меньшему количеству столкновений, но приведет к их возникновению. Кстати, если вы не являетесь экспертом или доктором философии, я не буду вам доверять ;-)   -  person rekire    schedule 17.04.2013
comment
Да, я не говорил, что это всегда дорого, но в моем случае да :) но я делаю магистерскую диссертацию ...   -  person Leonardo Rania    schedule 17.04.2013
comment
В этом случае я просто на шаг впереди, я завершил свой.   -  person rekire    schedule 17.04.2013
comment
хорошо :) Надеюсь связаться с вами как можно скорее: D   -  person Leonardo Rania    schedule 17.04.2013
comment
xor мне не подходит ..... моя хеш-функция теперь: h = join (h, CHAR.getIndex () + 1)   -  person Leonardo Rania    schedule 17.04.2013
comment
Какой язык программирования вы используете? XOR должен быть быстрым AFIK XOR также является командой процессора.   -  person rekire    schedule 17.04.2013
comment
c ++ .... конечно, xor работает быстро, но не в моем случае мне нужно найти число для суммирования или умножения или другую операцию с CHAR.getIndex () для разрешения коллизий .... но моя хеш-функция должна быть h = join (h, CHAR.getIndex ()) ....   -  person Leonardo Rania    schedule 17.04.2013


Ответы (1)


Вы можете попробовать функцию хеширования строк Java. Это мой порт C #, который нужно просто портировать на C ++:

int javaHash(String txt) {
    uint h = 0;
    if(txt.Length > 0) {
        for(int i = 0; i < txt.Length; i++) {
            h = 31 * h + txt[i];
        }
    }
    return (int)h;
}
person rekire    schedule 17.04.2013