PHP Murmurhash3 和 MySql Murmurhash3 有时不匹配
PHP Murmurhash3 and MySql Murmurhash3 sometimes don't match
我正在使用 Murmurhash3 为文本条目创建唯一的哈希值。创建文本条目时,我使用 this php implementation, which returns a 32 bit hash integer, to get the hash value. The hash is stored in a BINARY(16) database column. I also need to update our existing database so I'm using 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 sentence' 在两者中创建相同的散列。我做错了什么?
想通了。 PHP 的整数类型是有符号的,偶尔 Murmurhash 会产生与始终为正的 MySql 值不匹配的负散列值。解决方案是在基本转换之前使用 sprintf 格式化 php 的哈希值,格式设置为“%u”。
$hash = murmurhash3_int($text);
return base_convert(sprintf("%u\n", $hash), 10, 32);
有关详细信息,请参阅 php crc32 docs。
我正在使用 Murmurhash3 为文本条目创建唯一的哈希值。创建文本条目时,我使用 this php implementation, which returns a 32 bit hash integer, to get the hash value. The hash is stored in a BINARY(16) database column. I also need to update our existing database so I'm using 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 sentence' 在两者中创建相同的散列。我做错了什么?
想通了。 PHP 的整数类型是有符号的,偶尔 Murmurhash 会产生与始终为正的 MySql 值不匹配的负散列值。解决方案是在基本转换之前使用 sprintf 格式化 php 的哈希值,格式设置为“%u”。
$hash = murmurhash3_int($text);
return base_convert(sprintf("%u\n", $hash), 10, 32);
有关详细信息,请参阅 php crc32 docs。