3

Murmurhash3 を使用して、テキスト エントリの一意のハッシュを作成しています。テキスト エントリが作成されると、32 ビットのハッシュ整数を返すこの php 実装を使用して、ハッシュ値を取得します。ハッシュは BINARY(16) データベース列に格納されます。また、既存のデータベースを更新する必要があるため、この MySql 実装を使用してデータベースを更新しています。PHPで作成したハッシュに合わせるために、ベース変換して小文字化しています。

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

それは約 80% の確率で php バージョンと一致しますが、明らかにそれをカットするつもりはありません。たとえば、文字列「engtest」をハッシュする15d15mと、php と3uqiuqaMySql で作成されます。ただし、文字列「engtest 文」は両方で同じハッシュを作成します。私は何が間違っているのでしょうか?

4

1 に答える 1

3

理解した。PHP の整数型は符号付きであり、時折 Murmurhash が常に正の MySql 値と一致しない負のハッシュ値を生成していました。解決策は、基本変換の前に、フォーマットを「%u」に設定して sprintf を使用して、php のハッシュ値をフォーマットすることでした。

$hash = murmurhash3_int($text);

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

詳細については、php crc32 ドキュメントを参照してください。

于 2016-09-23T02:20:28.160 に答える