Я ищу алгоритм хеширования, который выдает 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;
Пожалуйста, дайте мне знать о лучших альтернативах.