2016-09-22 45 views
2

我正在使用Murmurhash3爲文本條目創建獨特的哈希值。當創建文本條目時,我使用this php implementation(它返回一個32位散列整數)來獲取散列值。散列存儲在BINARY(16)數據庫列中。我也需要更新我們現有的數據庫,所以我使用this MySql implementation來更新數據庫。爲了匹配php創建的哈希,我將它轉換爲底層,並將其封裝。PHP Murmurhash3和MySql Murmurhash3有時不匹配

UPDATE column SET hash=LOWER(CONV(murmur_hash_v3(CONCAT(column1, column2), 0), 10, 32)); 

它匹配PHP版本約80%的時間,這顯然不會削減它。例如,哈希字符串'engtest'會在MySql中創建15d15m的php和3uqiuqa。但是,字符串'engtest語句'在兩者中創建相同的散列。我可能做錯了什麼?

回答

1

想通了。 PHP的整數類型是帶符號的,有時候,Murmurhash產生的負散列值並不匹配總是正值的MySql值。解決方案是在基礎轉換之前使用格式設置爲「%u」的sprintf格式化php的哈希值。

$hash = murmurhash3_int($text); 

return base_convert(sprintf("%u\n", $hash), 10, 32); 

查看php crc32 docs瞭解更多信息。