【问题标题】:PHP Murmurhash3 and MySql Murmurhash3 sometimes don't matchPHP Murmurhash3 和 MySql Murmurhash3 有时不匹配
【发布时间】:2016-09-22 12:15:21
【问题描述】:

我正在使用 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 sentence' 在两者中创建了相同的哈希值。我可能做错了什么?

【问题讨论】:

    标签: php mysql hash murmurhash


    【解决方案1】:

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

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

    请参阅php crc32 docs 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多