2016-09-22 116 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了解更多信息。