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

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

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


当前回答

在哈希中实现md5比md5()快一点。 所以这可以是一个选项或其他,请尝试:

echo '<pre>';

$run = array();

function test($algo)
{
  #static $c = 0;
  #if($c>10) return;
  #$c++;

 $tss = microtime(true);
 for($i=0; $i<100000; $i++){
  $x = hash($algo, "ana are mere");
 }
 $tse = microtime(true);

 $GLOBALS['run'][(string)round($tse-$tss, 5)] = "\nhash({$algo}): \t".round($tse-$tss, 5) . " \t" . $x;
 #echo "\n$i nhash({$algo}): \t".round($tse-$tss, 5) . " \t" . $x;
}
array_map('test', hash_algos());
ksort($run);
print_r($run);
echo '</pre>';

你可以在http://www.dozent.net/Tipps-Tricks/PHP/hash-performance上看到

其他回答

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

与其假设MD5“相当慢”,不如尝试一下。在一台简单的PC上(我的PC是一台2.4 GHz Core2,使用单核),一个简单的基于c的MD5实现每秒可以散列600万条小消息。一个小消息在这里是最大55字节。对于较长的消息,MD5哈希速度与消息大小成线性,即它以大约每秒400兆字节的速度处理数据。您可能会注意到,这是一个好的硬盘或千兆以太网卡最大速度的四倍。

因为我的电脑有四个核心,这意味着我的硬盘最多只能提供或接收6%的可用计算能力。只有在非常特殊的情况下,哈希速度才会成为瓶颈,甚至在PC上产生明显的成本。

在较小的体系结构上,哈希速度可能变得有些重要,您可能希望使用MD4。MD4可以用于非加密目的(对于加密目的,无论如何都不应该使用MD5)。据报道,在基于arm的平台上,MD4甚至比CRC32更快。

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

+-------------------+---------+------+--------------+
|       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个字符)。

警告

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

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

原来的答案

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

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

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