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

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

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


当前回答

第一步:安装libsodium(或确保您使用的是PHP 7.2+)

第二步:使用以下方法之一:

sodium_crypto_generichash(),即BLAKE2b,这是一个比MD5更安全但比SHA256更快的哈希函数。(Link有基准测试等) sodium_crypto_shorthash(),它是SipHash-2-4,适用于哈希表,但不应该依赖于抗碰撞。

_shorthash的速度大约是_generichash的3倍,但是您需要一个密钥,并且存在较小但现实的碰撞风险。使用_generichash,您可能不需要担心冲突,也不需要使用键(但无论如何都可能需要)。

其他回答

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

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

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

在哈希中实现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上看到

在xxHash存储库上有一个速度比较。这是它显示的2021年1月12日。

Hash Name Width Bandwidth (GB/s) Small Data Velocity Quality Comment
XXH3 (SSE2) 64 31.5 GB/s 133.1 10
XXH128 (SSE2) 128 29.6 GB/s 118.1 10
RAM sequential read N/A 28.0 GB/s N/A N/A for reference
City64 64 22.0 GB/s 76.6 10
T1ha2 64 22.0 GB/s 99.0 9 Slightly worse [collisions]
City128 128 21.7 GB/s 57.7 10
XXH64 64 19.4 GB/s 71.0 10
SpookyHash 64 19.3 GB/s 53.2 10
Mum 64 18.0 GB/s 67.0 9 Slightly worse [collisions]
XXH32 32 9.7 GB/s 71.9 10
City32 32 9.1 GB/s 66.0 10
Murmur3 32 3.9 GB/s 56.1 10
SipHash 64 3.0 GB/s 43.2 10
FNV64 64 1.2 GB/s 62.7 5 Poor avalanche properties
Blake2 256 1.1 GB/s 5.1 10 Cryptographic
SHA1 160 0.8 GB/s 5.6 10 Cryptographic but broken
MD5 128 0.6 GB/s 7.8 10 Cryptographic but broken

xxHash似乎是目前为止最快的hash,而其他许多hash都打败了旧的hash,比如CRC32、MD5和SHA。

警告

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

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

原来的答案

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

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

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