我需要对字符串进行64位整数哈希,用于类似哈希映射的操作。
据我所知,PHP没有原生的哈希功能可以返回64位整数?
我认为可以将sha1哈希的第一部分转换为整数。但是这样做性能不佳,转换也很棘手。
当然,如果能使用原生的PHP函数而无需安装,则最好不过了。
我需要对字符串进行64位整数哈希,用于类似哈希映射的操作。
据我所知,PHP没有原生的哈希功能可以返回64位整数?
我认为可以将sha1哈希的第一部分转换为整数。但是这样做性能不佳,转换也很棘手。
当然,如果能使用原生的PHP函数而无需安装,则最好不过了。
我尝试了很多次,特别是将一个完整的64位十六进制字符串转换为带符号的64位整数。现在我得出了以下结果:
function sha1_64bitInt($str) {
$u = unpack('N2', sha1($str, true));
return ($u[1] << 32) | $u[2];
}
这个性能在中等水平。比实现完整的哈希算法(例如SimpleHash或dbj2)要好得多,但比直接调用sha1()
或crc32
慢得多。
如果有更好的解决方法来转换为64位整数,则可能在不破坏向后兼容性的情况下改进此函数(我希望如此)。
查看此页面以获取有关 md5 哈希的信息:
http://us.php.net/manual/en/function.md5.php
这将输出一个32个字符的十六进制字符串。每个十六进制字符表示4位数据。这意味着您需要16个十六进制字符(或MD5哈希值的一半)来生成64位。基本上
$stringToHash= "abcdefghijk...";
$hash = md5($stringToHash);
$substring = substr($hash, 0,16);
$finalInt = hexdec($substring);
这应该适用于您。(但我还没有测试过)
如果没有更好的想法,你可以很容易地修改murmurhash_php来调用64位版本的MurmurHash3。
我认为PHP不支持64位整数。有一个BigInteger类(非原生PHP)可供使用(如果您在Google上搜索得很好,就可以找到)。但它只是在内部使用字符串,并且非常复杂。
function hash64int($string)
{
return $string ? hexdec(hash('crc32', $string) . hash('crc32b', $string)) : null;
}
在某些情况下,32位哈希值可能已经足够。因此,您可以使用此函数并将其保存在无符号INT字段中:
function hash32int($string)
{
return $string ? hexdec(hash('crc32', $string)) : null;
}
我使用crc32是因为它比其他方法更快。