Каков хороший алгоритм хеширования для заполнения prng строкой?

StackOverflow https://stackoverflow.com/questions/678013

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Использовать ША-2

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top