Какой алгоритм хэширования наивысшей производительности доступен в php, когда безопасность НЕ поставлена ​​на карту? - PullRequest
9 голосов
/ 10 июля 2011

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

безопасность в этом контексте НЕ является проблемой.мы просто используем md5 как метод генерации уникального идентификатора для хранения различных элементов в apc и т. д.

столкновения - это проблема.хотя маловероятно, что это вызовет некоторые серьезные проблемы.

кто-нибудь хочет предложить что-нибудь более легкое на процессоре?

спасибо.


мы только что провели некоторое тестирование сmd5 против crc32.

с использованием следующего фрагмента:

<?
$start=microtime(true);
for($i=1;$i<=1000000;$i++){
    md5(rand(10000000,99999999)); <--- crc32 tested here too.
}
$end=microtime(true);
echo $end-$start."\n";
?>

результаты следующие:

md5:

1.4991459846497
1.7893800735474
1.4672470092773

crc32:

0.97880411148071
0.94331979751587
0.93316197395325

, поэтому кажется, что crc32 примерно на 1/3 быстрее, чем при использовании md5.

Ответы [ 3 ]

8 голосов
/ 10 июля 2011

Было бы очень трудно (почти невозможно, правда) превзойти CRC32 или его вариант, поскольку это так тривиально (переход на XOR через одно 32-битное слово).Более того, поскольку crc32 обманывает и переходит к собственному коду, если другое решение также не делает этого, скорее всего, нативная реализация CRC32 не будет побеждена.

Однако она также имеет много меньше места, чем MD5.Компромисс в порядке?CRC32 обычно используются только для базового обнаружения ошибок / формирования кадров ... (Это действительно «контрольная сумма», а не «хеширование» для практических целей разговора.)

Счастливое кодирование.


Кроме того, ваши цифры показывают сокращение только на 2/3 ;-) В любом случае, я подозреваю, что не является основным узким местом и очень рекомендую использовать алгоритм, который будет работать - будь то MD5 или SHA1или другой. MD5 лишь немного вычислительно дешевле, чем SHA1 (это в пределах порядка), но возможно, что реализация играет фактор.Запустите тесты по этому вопросу, если хотите ...

1 голос
/ 27 января 2012

Один из комментариев в онлайн-руководстве php показывает, что md4 - самый быстрый .Затем md5, затем crc32, затем sha1.

Мои собственные тесты подтверждают это.Очень странно, что ваш тест должен показать иначе.Я также попробовал ваш фрагмент и получил противоположные результаты.Возможно, это зависит от версии машины или PHP.

http://php.net/manual/en/function.hash-algos.php

0 голосов
/ 10 июля 2011

Ну, вы можете просто использовать имя переменной в качестве хэша, если вы хотите, чтобы свет на CPU. Если вы хотите преобразовать строку в тип int, просто обработайте ее как основание 256 и преобразуйте в тип int.

Возможно, вы можете попробовать sha, который выдает строку длиной 40 символов для любого ввода.

...