Хеш-функции с хорошей однородностью для неизвестного ввода - PullRequest
3 голосов
/ 20 декабря 2011

Я ищу хеш-функцию, которая разбивает большой набор входных данных с хорошей однородностью на небольшое количество секций (скажем, 100 или 256).Это означает, что я ожидаю много коллизий, и мне плевать на коллизии.

Входные данные заранее неизвестны.Я ожидаю строки длиной от 6 до 100 байт.Строки могут быть очень плохо распределены (например, большая часть заполнена пробелами или содержит только цифры).

Алгоритмы CRC - одна из первых идей, которая приходит на ум. CRC8 было предложено, но без предоставления информации о его однородности;для CRC32, по-видимому, однородность не так уж хороша .

Существуют списки простых или универсальных хеш-функций, но без указания ихединообразие.

У Боба Дженкинса есть полная статья о хеш-функциях, которые возвращают 32-битное значение.Я предполагаю, что для равномерно распределенного 32-битного значения все возможные 8-битные подмножества должны быть равномерно распределены, поэтому есть хорошие кандидаты.Но может быть стоит уменьшить 32-битное значение до 8-битного, если есть более простые алгоритмы для 8-битного кода?

1 Ответ

0 голосов
/ 26 декабря 2011

Я обнаружил, что алгоритм sdbm показывает хорошую однородность, будучи довольно простым:

        h := 0.
        forEach ch in str {
            h := (h * 65599) + ch;
        }
...