[英]How to get a 64 bit integer hash from a string in PHP?
我需要 64 位 integer 字符串散列,例如 hash map。
在我看來,好像沒有可以返回 64 位整數的本機 PHP hash 功能?
我認為可以將 sha1 hash 的第一部分轉換為 integer。 但是,這不會帶來最佳性能,而且轉換似乎很棘手。
當然,不用安裝就可以使用本機 PHP 功能。
我嘗試了很多,尤其是將完整的 64 位十六進制字符串轉換為有符號的 64 位 integer。 現在我結束了:
function sha1_64bitInt($str) {
$u = unpack('N2', sha1($str, true));
return ($u[1] << 32) | $u[2];
}
性能介於中間。 比實現完整的 hash 算法(如 SimpleHash 或 dbj2)要好得多,並且比對sha1()
或crc32
的裸調用慢得多。
如果有更好的解決方案可以轉換為 64 位 integer,則可以在不破壞向后兼容性的情況下改進此 function(我希望)。
有關 md5 hash 的信息,請參閱此頁面:
http://us.php.net/manual/en/function.md5.php
這將 output 一個 32 字符的十六進制字符串。 每個十六進制字符代表 4 位數據。 這意味着您需要 16 個十六進制字符(或 md5 哈希的一半)來生成 64 位。
然后,您可以使用 hexdec 將 64 位 (16x4=64) 從 hex 轉換為 int。 請注意,如果您傳遞超過 64 位,則 function 將溢出到浮點類型以嘗試表示更大的數字
所以基本上
$stringToHash= "abcdefghijk...";
$hash = md5($stringToHash);
$substring = substr($hash, 0,16);
$finalInt = hexdec($substring);
那應該對你有用。 (但我沒有測試過)。
有關 CRC64 實現,請參見http://php.net/manual/ru/function.crc32.php#111699 。
如果沒有其他人有更好的主意,您可能可以修改murmurhash_php以非常輕松地調用 64 位版本的MurmurHash3 。
我認為 PHP 不支持 64 位整數。 有一個 BigInteger class (不是原生 PHP),你可以使用(如果你用谷歌搜索的話)。 但它只是在內部使用字符串,而且非常復雜。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.