2016-04-20 5 views
1

私は確率的な平均化を使用してhyperloglog計数アルゴリズムを実装しようとしています。これを行うためには、異なるサブストリームのアイテムをハッシュするために、多くの独立したユニバーサルハッシュ関数が必要です。独立したユニバーサルハッシュ関数のファミリーを取得するには?

hashlib に利用できるハッシュ関数がほんのわずかであることがわかりました。シードなどを提供する方法がないようですね。私は、異なるサブストリームに異なる塩を使用することを考えています。

+0

私は専門家だが、あなただけの、すなわち塩後のハッシュを追加することはできませんとにかく衝突があるように起こっているので、ハッシュ自体に?実際の要件/期待が「独立」であることを意味するものではありません。 – unwind

+0

@unwindもし私が塩を使用するのであれば、どのライブラリ関数を使うべきですか?私は見つけられませんでした。 –

+1

申し訳ありませんが、ライブラリの推奨事項は、スタックオーバーフローに関するトピックです。しかし、とにかく... hashlib関数は[暗号ハッシュ関数](https://en.wikipedia.org/wiki/Cryptographic_hash_function)ですが、ハッシュテーブルなどの作成に使用できますが、比較的遅いです。おそらく、あなたはPythonの組み込み 'hash()'関数をWikipediaの[universal hashing]の 'h(a、b、x)=(a * x + b)%p% ](https://en.wikipedia.org/wiki/Universal_hashing#Hashing_integers)。 –

答えて

1

おそらく異なるハッシュ関数は必要ありません。この問題の一般的な解決方法は、ハッシュの一部のみを使用してHyperLogLog rho統計を計算し、もう1つの部分でサブストリームを選択することです。良いハッシュ関数(例:murmur3)を使用すると、効果的に複数の独立した関数として動作します。

は、この説明のために、ここで「確率論的平均化」を参照してください: https://research.neustar.biz/2012/10/25/sketch-of-the-day-hyperloglog-cornerstone-of-a-big-data-infrastructure/

+0

しかし、Pythonには 'murmur3'実装が組み込まれていません。おそらく 'md5'のような暗号ハッシュ関数を使用してください。これは128ビットを一度に与えることになります。 –

+0

良い点ですが、あなたが制約されていなければ、私は先に進んで、外部雑音3の実装を消費します。いずれにしても、ハッシュ関数があなたのスピード要件を満たすことを確認する必要があります(暗号化ハッシュ関数が遅いことに注意してください)。ハッシュ長要件(少なくとも64ビット。128は過剰ですが、すべてのビットを使用する)。 – OronNavon