我使用Murmurhash3为文本条目创建唯一的散列。在创建文本条目时,我使用这个php实现 (它返回一个32位散列整数)来获取哈希值。散列存储在二进制(16)数据库列中。我还需要更新我们现有的数据库,所以我使用这个MySql实现来更新数据库。为了匹配php创建的散列,我将对其进行基本转换并降低其大小写。
UPDATE column SET hash=LOWER(CONV(murmur_hash_v3(CONCAT(column1, column2), 0), 10, 32));它大约有80%的时间与php版本相匹配,这显然不会削减它。例如,哈希字符串'engtest‘在php中创建15d15m,在MySql中创建3uqiuqa。但是,字符串'engtest语句‘在两个字符串中都会创建相同的散列。我做错什么了?
发布于 2016-09-23 02:20:28
弄明白了。PHP的整数类型是有符号的,并且有时候Murmurhash会产生与总是正的MySql值不匹配的负散列值。解决方案是在基本转换之前使用sprintf格式化php的散列值,格式设置为"%u“。
$hash = murmurhash3_int($text);
return base_convert(sprintf("%u\n", $hash), 10, 32);有关更多信息,请参见php crc32文档。
https://stackoverflow.com/questions/39638805
复制相似问题