我基本上准备短语被放入数据库,他们可能是畸形的,所以我想要存储他们的一个短哈希代替(我将只是比较他们是否存在,所以哈希是理想的)。
我假设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更快。
其他回答
fcn time generated hash
crc32: 0.03163 798740135
md5: 0.0731 0dbab6d0c841278d33be207f14eeab8b
sha1: 0.07331 417a9e5c9ac7c52e32727cfd25da99eca9339a80
xor: 0.65218 119
xor2: 0.29301 134217728
add: 0.57841 1105
生成这个的代码是:
$loops = 100000;
$str = "ana are mere";
echo "<pre>";
$tss = microtime(true);
for($i=0; $i<$loops; $i++){
$x = crc32($str);
}
$tse = microtime(true);
echo "\ncrc32: \t" . round($tse-$tss, 5) . " \t" . $x;
$tss = microtime(true);
for($i=0; $i<$loops; $i++){
$x = md5($str);
}
$tse = microtime(true);
echo "\nmd5: \t".round($tse-$tss, 5) . " \t" . $x;
$tss = microtime(true);
for($i=0; $i<$loops; $i++){
$x = sha1($str);
}
$tse = microtime(true);
echo "\nsha1: \t".round($tse-$tss, 5) . " \t" . $x;
$tss = microtime(true);
for($i=0; $i<$loops; $i++){
$l = strlen($str);
$x = 0x77;
for($j=0;$j<$l;$j++){
$x = $x xor ord($str[$j]);
}
}
$tse = microtime(true);
echo "\nxor: \t".round($tse-$tss, 5) . " \t" . $x;
$tss = microtime(true);
for($i=0; $i<$loops; $i++){
$l = strlen($str);
$x = 0x08;
for($j=0;$j<$l;$j++){
$x = ($x<<2) xor $str[$j];
}
}
$tse = microtime(true);
echo "\nxor2: \t".round($tse-$tss, 5) . " \t" . $x;
$tss = microtime(true);
for($i=0; $i<$loops; $i++){
$l = strlen($str);
$x = 0;
for($j=0;$j<$l;$j++){
$x = $x + ord($str[$j]);
}
}
$tse = microtime(true);
echo "\nadd: \t".round($tse-$tss, 5) . " \t" . $x;
第一步:安装libsodium(或确保您使用的是PHP 7.2+)
第二步:使用以下方法之一:
sodium_crypto_generichash(),即BLAKE2b,这是一个比MD5更安全但比SHA256更快的哈希函数。(Link有基准测试等) sodium_crypto_shorthash(),它是SipHash-2-4,适用于哈希表,但不应该依赖于抗碰撞。
_shorthash的速度大约是_generichash的3倍,但是您需要一个密钥,并且存在较小但现实的碰撞风险。使用_generichash,您可能不需要担心冲突,也不需要使用键(但无论如何都可能需要)。
如果你正在寻找快速和独特的,我推荐xxHash或使用较新的cpu的crc32c内置命令的东西,请参阅https://stackoverflow.com/a/11422479/32453。它还链接到更快的哈希如果你不太关心碰撞的可能性。
与其假设MD5“相当慢”,不如尝试一下。在一台简单的PC上(我的PC是一台2.4 GHz Core2,使用单核),一个简单的基于c的MD5实现每秒可以散列600万条小消息。一个小消息在这里是最大55字节。对于较长的消息,MD5哈希速度与消息大小成线性,即它以大约每秒400兆字节的速度处理数据。您可能会注意到,这是一个好的硬盘或千兆以太网卡最大速度的四倍。
因为我的电脑有四个核心,这意味着我的硬盘最多只能提供或接收6%的可用计算能力。只有在非常特殊的情况下,哈希速度才会成为瓶颈,甚至在PC上产生明显的成本。
在较小的体系结构上,哈希速度可能变得有些重要,您可能希望使用MD4。MD4可以用于非加密目的(对于加密目的,无论如何都不应该使用MD5)。据报道,在基于arm的平台上,MD4甚至比CRC32更快。
Adler32在我的机器上运行得最好。 md5()比crc32()更快。