По сути, я готовлю фразы для помещения в базу данных, они могут быть искажены, поэтому я хочу вместо них сохранить короткий хеш (я буду просто сравнивать, существуют они или нет, поэтому хеш идеален).
Я предполагаю, что MD5 довольно медленно обрабатывает более 100 000 запросов, поэтому я хотел бы знать, какой будет лучший способ для хеширования фраз, возможно, развертывание моей собственной хэш-функции или использование hash('md4', '...'
в конечном итоге будет быстрее?
Я знаю, что в MySQL есть MD5 (), так что это немного увеличит скорость выполнения запроса, но, возможно, есть еще более быстрая функция хеширования в MySQL, о которой я не знаю, которая будет работать с PHP ..
Ответы:
CRC32 довольно быстрый, и для него есть функция: http://www.php.net/manual/en/function.crc32.php
Но вы должны знать, что CRC32 будет иметь больше коллизий, чем MD5 или даже хэши SHA-1, просто из-за уменьшенной длины (32 бита по сравнению со 128 битами и 160 битами соответственно). Но если вы просто хотите проверить, не повреждена ли сохраненная строка, вам подойдет CRC32.
источник
И код, используемый для генерации это:
источник
hash_algos()
. Следующий код для тестирования хэшей был в комментариях PHP ==> codepad.viper-7.com/5Wdhw6md5
быстрее. Лучшим тестом будет рандомизировать содержимое и длину строк. Таким образом, мы получаем лучшее представление о реальной производительности в реальном мире. Это также позволит избежать кеширования. Посмотрите: производительность контрольной суммы хэширования phpРанжированный список, в котором каждый цикл разделяет одно и то же для шифрования, как и все остальные.
И выход
источник
strlen($characters)
должно бытьstrlen($characters) - 1
:)На сайте xxhash есть сравнение скорости. Скопируйте его здесь:
Похоже, что xxHash является самым быстрым, в то время как многие другие используют более старые хеши, такие как CRC32, MD5 и SHA.
https://code.google.com/p/xxhash/
Обратите внимание, что это порядок 32-битной компиляции. На 64-битной компиляции порядок производительности, вероятно, очень отличается. Некоторые из хэшей основаны на 64-битных умножениях и выборках.
источник
Кажется, что crc32 быстрее для небольших сообщений (в данном случае 26 символов), а md5 для более длинных сообщений (в данном случае> 852 символа).
источник
Обновление 2019 года: этот ответ является наиболее актуальным. Библиотеки для поддержки ропота в основном доступны для всех языков.
В настоящее время рекомендуется использовать семейство Murmur Hash (см., В частности, варианты murmur2 или murmur3 ).
Хэши Murmur были разработаны для быстрого хеширования с минимальными коллизиями (намного быстрее, чем CRC, MDx и SHAx). Он идеально подходит для поиска дубликатов и очень подходит для индексов HashTable.
Фактически он используется многими современными базами данных (Redis, ElastisSearch, Cassandra) для вычисления всевозможных хэшей для различных целей. Этот конкретный алгоритм стал основным источником многих улучшений производительности в текущем десятилетии.
Это также используется в реализациях Bloom Filters . Вы должны знать, что если вы ищете «быстрые хэши», вы, вероятно, сталкиваетесь с типичной проблемой, которая решается фильтрами Блума. ;-)
Примечание : шум - это хэш общего назначения, означающий НЕ криптографический. Это не мешает найти исходный «текст», сгенерировавший хеш. НЕ подходит для хэширования паролей.
Еще несколько деталей: MurmurHash - что это?
источник
Вместо того, чтобы предполагать, что MD5 «довольно медленный», попробуйте. Простая реализация MD5 на основе C на простом ПК (мой, 2,4 ГГц Core2, использующий одно ядро) может хэшировать 6 миллионов маленьких сообщений в секунду . Небольшое сообщение здесь что-нибудь до 55 байтов. Для более длинных сообщений скорость хеширования MD5 является линейной по отношению к размеру сообщения, то есть он обрабатывает данные со скоростью около 400 мегабайт в секунду. Вы можете заметить, что это в четыре раза превышает максимальную скорость хорошего жесткого диска или гигабитной сетевой карты Ethernet.
Поскольку мой ПК имеет четыре ядра, это означает, что хеширование данных с той скоростью, с которой мой жесткий диск может предоставлять или получать, использует не более 6% доступной вычислительной мощности. Для того чтобы скорость хэширования стала узким местом или даже привела к ощутимым затратам на ПК, требуется особая ситуация.
На гораздо меньших архитектурах, где скорость хеширования может стать несколько уместной, вы можете использовать MD4. MD4 подходит для не криптографических целей (и для криптографических целей вы не должны использовать MD5 в любом случае). Сообщалось, что MD4 даже быстрее, чем CRC32 на платформах на основе ARM.
источник
Предостережение
Ответ ниже не отвечает на заданный вопрос, так как не рекомендует хеш-функции. Помните: «Хеш-функция - это любая функция, которую можно использовать для сопоставления данных произвольного размера со значениями фиксированного размера». (Wikipedia) Ответ ниже рекомендует преобразования, которые не гарантируют результаты фиксированного размера.
Если вы хотите ослабить требование использования хэш-функции , читайте дальше ...
Оригинальный ответ
Я предлагаю urlencode () или base64_encode () по этим причинам:
Адаптируя тестовый код в других местах этих ответов, я продемонстрировал, что любой из них работает намного быстрее любого хэш-алгоритма. В зависимости от вашего приложения вы можете использовать urlencode () или base64_encode () для очистки любых «искаженных» строк, которые вы хотите сохранить.
источник
Шаг первый: установите libsodium (или убедитесь, что вы используете PHP 7.2+)
Шаг второй: используйте одно из следующего:
sodium_crypto_generichash()
, который является BLAKE2b , хэш - функция более надежен , чем MD5 , но быстрее , чем SHA256. (Ссылка имеет ориентиры и т. Д.)sodium_crypto_shorthash()
Это SipHash-2-4 , который подходит для хеш-таблиц, но не следует полагаться на сопротивление столкновению._shorthash
примерно в 3 раза быстрее_generichash
, но вам нужен ключ, и у вас есть небольшой, но реалистичный риск столкновения. С_generichash
, вам, вероятно, не нужно беспокоиться о столкновениях, и вам не нужно использовать ключ (но может понадобиться в любом случае).источник
sodium_crypto_generichash(), which is BLAKE2b, a hash function more secure than MD5 but faster than SHA256. (Link has benchmarks, etc.)
- конечно, blake2b, но реализация USERLAND PHP для blake2b будет намного медленнее, чем реализация sha256 для PHP на C ... я бы хотел, чтобы PHP мог использовать blake2b в пакете hash_algos () ..Если вы ищете быстрый и уникальный, я рекомендую xxHash или что-то, что использует встроенную команду нового процессора crc32c, смотрите https://stackoverflow.com/a/11422479/32453 . Там также есть ссылки на, возможно, даже более быстрые хэши, если вы не слишком заботитесь о возможности столкновения.
источник
Adler32 работает лучше всего на моей машине. И
md5()
оказалось быстрее чемcrc32()
.источник
Реализация для md5 внутри хеша немного быстрее, чем для md5 (). Так что это может быть вариант или что-то еще, пожалуйста, попробуйте:
Вы можете увидеть на http://www.dozent.net/Tipps-Tricks/PHP/hash-performance
источник
CRC32 быстрее, но менее безопасен, чем MD5 и SHA1. Между MD5 и SHA1 разница в скорости невелика.
источник