我基本上准备短语被放入数据库,他们可能是畸形的,所以我想要存储他们的一个短哈希代替(我将只是比较他们是否存在,所以哈希是理想的)。

我假设MD5在100,000+请求时相当慢,所以我想知道什么是哈希短语的最佳方法,也许是推出我自己的哈希函数或使用哈希('md4', '…“最终会更快吗?”

我知道MySQL有MD5(),所以这将在查询端补充一点速度,但也许在MySQL中还有一个更快的哈希函数,我不知道这将与PHP一起工作。


当前回答

如果你正在寻找快速和独特的,我推荐xxHash或使用较新的cpu的crc32c内置命令的东西,请参阅https://stackoverflow.com/a/11422479/32453。它还链接到更快的哈希如果你不太关心碰撞的可能性。

其他回答

2019年更新:这个答案是最新的。支持杂音的库在很大程度上适用于所有语言。

目前的建议是使用低语哈希族(具体参见murmur2或murmur3变体)。

杂音哈希是为最小碰撞的快速哈希而设计的(比CRC、MDx和SHAx快得多)。它非常适合用于查找重复项,并且非常适合用于HashTable索引。

事实上,许多现代数据库(Redis, ElastisSearch, Cassandra)都使用它来计算各种各样的哈希值。这个特定的算法是当前十年中许多性能改进的根源。

它也用于Bloom Filters的实现中。您应该意识到,如果您正在搜索“快速哈希”,您可能会面临一个由Bloom过滤器解决的典型问题。: -)

注意:杂音是一个通用散列,意思是非加密的。它不会阻止查找生成散列的源“文本”。哈希密码是不合适的。

更多细节:MurmurHash -它是什么?

警告

下面的答案没有回答所问的问题,因为它不推荐哈希函数。记住,“哈希函数是可以用来将任意大小的数据映射到固定大小值的任何函数。”(维基百科)下面的答案建议转换不能保证固定大小的结果。

如果您愿意放宽使用哈希函数的要求,请继续阅读…

原来的答案

出于以下原因,我建议使用urlencode()或base64_encode():

不需要密码学 你需要速度 您需要一种方法来识别唯一的字符串,同时清理“畸形”字符串

在这些回复的其他地方调整基准代码,我已经证明了这两种方法都比任何哈希算法快得多。取决于你的应用程序,你可以使用urlencode()或base64_encode()清理任何你想要存储的“畸形”字符串。

CRC32速度更快,但安全性不如MD5和SHA1。MD5和SHA1在速度上没有太大的差别。

CRC32非常快,有一个函数:http://www.php.net/manual/en/function.crc32.php

但是你应该意识到CRC32会比MD5甚至SHA-1哈希有更多的冲突,仅仅是因为长度减少了(32位相比128位,分别是160位)。但如果你只是想检查存储的字符串是否损坏,使用CRC32也没问题。

Adler32在我的机器上运行得最好。 md5()比crc32()更快。