6

Python と Scala の両方で文字列を MurmurHash する必要があります。しかし、それらは非常に異なる結果をもたらしています。Scala の組み込みMurmurHash3ライブラリは、私がオンラインのものを含めて試した他のライブラリと同じ結果をもたらさないようです。奇妙なことに、複数の文字ではなく、1 つの文字で一致するように見えます。ここではいくつかの例を示します。

パイソン:

mmh3.hash('string', 0)
res: -1390314837

スカラ:

MurmurHash3.stringHash("string", 0)
res: 379569354

Javaが署名していて、PythonのC実装がunsignedを使用していることを知っているので、signedおよびunsigned intで遊んでみました。しかし、NumPy を使用して signed int に変換しても、何の助けにもなりません。この Web サイトは、Python の実装に同意しているようです。

http://murmurhash.shorelabs.com/

ここで何が起こっているのかについてのアイデアはありますか?

4

2 に答える 2

3

Scala は、UTF-16 としてエンコードされた Java 文字列を使用します。これらはInt;に一度に 2 つパックされます。Python は a char*(8 ビット) を使用するため、一度に 2 文字ではなく 4 文字でパックします。

編集:Scalaは文字をMSB順にパックします(s.charAt(i) << 16) | (s.charAt(i+1))。まったく同じ答えを得ることが本当に重要な場合は、ショーツの配列に切り替えてから、それらのすべてのペアを交換する必要がある場合があります. (または、Scala コードを Python に、またはその逆に移植します。) また、文字列の長さでファイナライズします。Python が長さデータをどのように組み込むかはわかりません。"\u0000"(これは、文字列とを区別できるようにするために重要です"\u0000\u0000"。)

于 2016-08-27T05:59:49.873 に答える