2009-08-25 6 views
12

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

Спасибо!

+0

Вы имеете в виду «хороший» хэш, как в хорошей безопасности или в хорошем распределении ключей ? Первый, как правило, дает вам второй, но по сравнительно высокой цене. – RBarryYoung

+17

На следующей странице представлено несколько реализаций хэш-функций общего назначения, которые являются эффективными и демонстрируют минимальные конфликты: http://partow.net/programming/hashfunctions/index.html – 2010-10-31 23:15:01

ответ

3

Может быть, это достаточно хорошо для вас:

echo sprintf('%u', crc32($string)); 

EDIT: Другой подобный альтернативный,

echo hash('adler32', $string); 
4

Выход MD5 является число, так же, как с почти все мыслимые хэш , Это просто число, которое обычно выражается в гексагоне. Используйте любой хеш-алгоритм, который вам удобно использовать, нарезать столько бит, сколько вы хотите, и обрабатывать эти биты как число. Любой good hash будет иметь свой последний (или первый или средний) n бит, равномерно распределенный как целое значение.

+3

Да, но усечение или сложение результата хэша приведет к как с точки зрения безопасности, так и с точки зрения распределения. – nik

+2

Если хэш хорош (если это подходящее приближение к идеальному хешу), то при его усечении он будет оставаться одинаково хорошо распределенным и не потеряет никакой безопасности, кроме того, что из-за ограниченного пространства ключей. – hobbs

0

Вы можете использовать base_convert изменить шестнадцатеричной в десятичную числа и наоборот. Если вы хотите преобразовать целые числа (как строку) в шестнадцатеричный, вы ограничены 32-битными числами или менее. Я верю (PHP_INT_MAX).

php -r 'foreach (hash_algos() as $hash) { echo $hash, "\n", $a = hash($hash, "test"), "\n", $b = base_convert($a, 16, 10), "\n", $c = base_convert($b, 10, 16), "\n", ($c === $a ? "yes" : "no"), "\n\n"; }' > hashes.txt 

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

adler32 
c1015d04 
3238092036 
c1015d04 
yes 

crc32 
accf8b33 
2899282739 
accf8b33 
yes 

crc32b 
d87f7e0c 
3632233996 
d87f7e0c 
yes 
Смежные вопросы