PHP Murmurhash3和MySql Murmurhash3有时候不匹配

时间:2016-09-22 12:15:22

标签: php mysql hash murmurhash

我使用Murmurhash3为文本条目创建唯一的哈希值。创建文本条目时,我使用this php implementation返回32位哈希整数来获取哈希值。哈希存储在BINARY(16)数据库列中。我还需要更新现有数据库,以便我使用this MySql implementation更新数据库。为了匹配php创建的哈希,我将基本转换它并降低它的外壳。

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

大约80%的时间它与php版本匹配,显然不会削减它。例如,散列字符串' engtest'在php中创建15d15m,在MySql中创建3uqiuqa。但是,字符串' engtest句子'在两者中创建相同的哈希。我能做错什么?

1 个答案:

答案 0 :(得分:1)

想出来。 PHP的整数类型是有符号的,偶尔Murmurhash产生的负哈希值与总是正的MySql值不匹配。解决方案是在基本转换之前使用sprintf格式化php的哈希值,格式设置为“%u”。

$hash = murmurhash3_int($text);

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

有关详细信息,请参阅php crc32 docs