2016-09-22 3 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)); 

これは明らかにそれをカットしない時間の約80%のPHPバージョンに一致します。たとえば、文字列 'engtest'をハッシュすると、PHPでは15d15m、MySqlでは3uqiuqaが作成されます。しかし、文字列 'engtest sentence'は、両方に同じハッシュを作成します。私は何が間違っていますか?

答えて

1

PHPの整数型が署名され、Murmurhashが常に正のMySql値と一致しない負のハッシュ値を生成していたことがあります。解決策は、基本変換の前にフォーマットが "%u"に設定されたsprintfを使用してPHPのハッシュ値をフォーマットすることでした。

$hash = murmurhash3_int($text); 

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

詳細はphp crc32 docsを参照してください。

関連する問題