Что такое хороший алгоритм хеширования для заполнения строки с помощью строки? - PullRequest
3 голосов
/ 24 марта 2009

Я ищу алгоритм хеширования, который выдает 31/32-битное целое число со знаком / без знака в качестве дайджеста для строки utf8 с целью использования выходных данных для заполнения prng, таких как Park-Miller-Carta LCG или Мерсенн-Твистер.

Я изучил FNV1 и FNV1a, но они предоставляют очень близкие значения для похожих строк, различающихся по последнему символу; Я хотел бы иметь хеш с низким коллизией, который радикально меняется при минимальных изменениях входной строки. Производительность не проблема.

Мой текущий подход заключается в использовании грязной LCG, в которой в качестве множителей используются коды символов и простое число:

a = 524287;
for ( i = 0; i < n; i ++ )
a = ( a * string.charCodeAt ( i ) * 16807 + 524287 ) % 2147483647;

Пожалуйста, дайте мне знать о лучших альтернативах.

Ответы [ 3 ]

3 голосов
/ 24 марта 2009

Использование SHA-2

Это лучший / самый последний алгоритм хэширования. Всегда рекомендуется использовать стандартные алгоритмы.

1 голос
/ 24 марта 2009

Любой криптографически сильный хеш будет иметь нужные вам свойства, но генерировать больше битов, но будет просто урезать результат до 32 бит. Я предполагаю, что криптографическая стойкость не является фактическим требованием, поэтому некорректные (но широко используемые) схемы хеширования, такие как MD5, были бы адекватными - и легко доступны во многих библиотеках.

1 голос
/ 24 марта 2009

Если вы генерируете 32-битное значение, рассмотрите возможность использования классического CRC32. FNV - быстрая альтернатива CRC, и вы говорите, что производительность не является проблемой.

...