我基本上准备短语被放入数据库,他们可能是畸形的,所以我想要存储他们的一个短哈希代替(我将只是比较他们是否存在,所以哈希是理想的)。
我假设MD5在100,000+请求时相当慢,所以我想知道什么是哈希短语的最佳方法,也许是推出我自己的哈希函数或使用哈希('md4', '…“最终会更快吗?”
我知道MySQL有MD5(),所以这将在查询端补充一点速度,但也许在MySQL中还有一个更快的哈希函数,我不知道这将与PHP一起工作。
我基本上准备短语被放入数据库,他们可能是畸形的,所以我想要存储他们的一个短哈希代替(我将只是比较他们是否存在,所以哈希是理想的)。
我假设MD5在100,000+请求时相当慢,所以我想知道什么是哈希短语的最佳方法,也许是推出我自己的哈希函数或使用哈希('md4', '…“最终会更快吗?”
我知道MySQL有MD5(),所以这将在查询端补充一点速度,但也许在MySQL中还有一个更快的哈希函数,我不知道这将与PHP一起工作。
当前回答
与其假设MD5“相当慢”,不如尝试一下。在一台简单的PC上(我的PC是一台2.4 GHz Core2,使用单核),一个简单的基于c的MD5实现每秒可以散列600万条小消息。一个小消息在这里是最大55字节。对于较长的消息,MD5哈希速度与消息大小成线性,即它以大约每秒400兆字节的速度处理数据。您可能会注意到,这是一个好的硬盘或千兆以太网卡最大速度的四倍。
因为我的电脑有四个核心,这意味着我的硬盘最多只能提供或接收6%的可用计算能力。只有在非常特殊的情况下,哈希速度才会成为瓶颈,甚至在PC上产生明显的成本。
在较小的体系结构上,哈希速度可能变得有些重要,您可能希望使用MD4。MD4可以用于非加密目的(对于加密目的,无论如何都不应该使用MD5)。据报道,在基于arm的平台上,MD4甚至比CRC32更快。
其他回答
2019年更新:这个答案是最新的。支持杂音的库在很大程度上适用于所有语言。
目前的建议是使用低语哈希族(具体参见murmur2或murmur3变体)。
杂音哈希是为最小碰撞的快速哈希而设计的(比CRC、MDx和SHAx快得多)。它非常适合用于查找重复项,并且非常适合用于HashTable索引。
事实上,许多现代数据库(Redis, ElastisSearch, Cassandra)都使用它来计算各种各样的哈希值。这个特定的算法是当前十年中许多性能改进的根源。
它也用于Bloom Filters的实现中。您应该意识到,如果您正在搜索“快速哈希”,您可能会面临一个由Bloom过滤器解决的典型问题。: -)
注意:杂音是一个通用散列,意思是非加密的。它不会阻止查找生成散列的源“文本”。哈希密码是不合适的。
更多细节:MurmurHash -它是什么?
+-------------------+---------+------+--------------+
| NAME | LOOPS | TIME | OP/S |
+-------------------+---------+------+--------------+
| sha1ShortString | 1638400 | 2.85 | 574,877.19 |
| md5ShortString | 2777680 | 4.11 | 675,834.55 |
| crc32ShortString | 3847980 | 3.61 | 1,065,922.44 |
| sha1MediumString | 602620 | 4.75 | 126,867.37 |
| md5MediumString | 884860 | 4.69 | 188,669.51 |
| crc32MediumString | 819200 | 4.85 | 168,907.22 |
| sha1LongString | 181800 | 4.95 | 36,727.27 |
| md5LongString | 281680 | 4.93 | 57,135.90 |
| crc32LongString | 226220 | 4.95 | 45,701.01 |
+-------------------+---------+------+--------------+
似乎crc32对于较小的消息(在本例中为26个字符)更快,而md5对于较长的消息(在本例中为>852个字符)。
CRC32速度更快,但安全性不如MD5和SHA1。MD5和SHA1在速度上没有太大的差别。
CRC32非常快,有一个函数:http://www.php.net/manual/en/function.crc32.php
但是你应该意识到CRC32会比MD5甚至SHA-1哈希有更多的冲突,仅仅是因为长度减少了(32位相比128位,分别是160位)。但如果你只是想检查存储的字符串是否损坏,使用CRC32也没问题。
第一步:安装libsodium(或确保您使用的是PHP 7.2+)
第二步:使用以下方法之一:
sodium_crypto_generichash(),即BLAKE2b,这是一个比MD5更安全但比SHA256更快的哈希函数。(Link有基准测试等) sodium_crypto_shorthash(),它是SipHash-2-4,适用于哈希表,但不应该依赖于抗碰撞。
_shorthash的速度大约是_generichash的3倍,但是您需要一个密钥,并且存在较小但现实的碰撞风险。使用_generichash,您可能不需要担心冲突,也不需要使用键(但无论如何都可能需要)。