我需要64位整数的字符串哈希,就像哈希映射一样。
在我看来,没有可以返回64位整数的本机PHP哈希函数?
我认为可以采用sha1哈希的第一部分并将其转换为整数。然而,这不会带来最佳性能,转换似乎很棘手。
当然,没有安装就可以使用本机PHP函数。
答案 0 :(得分:4)
我尝试了很多,特别是将完整的64位十六进制字符串转换为带符号的64位整数。现在我最终得到了这个:
function sha1_64bitInt($str) {
$u = unpack('N2', sha1($str, true));
return ($u[1] << 32) | $u[2];
}
表演处于中间位置。比实现完整哈希算法(如SimpleHash或dbj2)要好得多,比对sha1()
或crc32
的裸调用要慢很多。
当有一个更好的解决方案转换为64位整数时,可以在不破坏向后兼容性的情况下改进此功能(我希望)。
答案 1 :(得分:3)
有关md5哈希的信息,请参阅此页:
http://us.php.net/manual/en/function.md5.php
这将输出一个32字符的十六进制字符串。每个十六进制字符代表4位数据。这意味着您需要16个十六进制字符(或md5哈希的一半)来生成64位。
然后您可以使用hexdec将64位(16x4 = 64)从十六进制转换为int。请注意,如果超过64位,函数将溢出到float类型以尝试表示更大的数字
所以基本上
$stringToHash= "abcdefghijk...";
$hash = md5($stringToHash);
$substring = substr($hash, 0,16);
$finalInt = hexdec($substring);
这对你有用。 (但我没有测试过它。)
答案 2 :(得分:0)
如果没有其他人有更好的想法,您可以修改murmurhash_php以轻松调用64位版本的MurmurHash3。
答案 3 :(得分:0)
我认为PHP不支持64位整数。你可以使用一个BigInteger类(不是本机PHP)(如果谷歌真的很好找到)。但它只是在内部使用字符串,而且它是复杂的。
答案 4 :(得分:0)
有关CRC64实现的信息,请参见http://php.net/manual/ru/function.crc32.php#111699。
答案 5 :(得分:0)
我写了这个函数。它使用不同的 crc32 和 crc32b 来计算两个 32 位哈希,然后将它们组合以获得 64 位哈希。最后将其转换为 64 位整数保存在 MySQL 数据库中的 unsigned BIGINT 字段中。
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,因为它比其他的要牢固。