簡體   English   中英

如何從 PHP 中的字符串中獲取 64 位 integer hash?

[英]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 將溢出到浮點類型以嘗試表示更大的數字

http://php.net/hexdec

所以基本上

$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM