web-dev-qa-db-ja.com

一意のIDのシーケンスのハッシュ関数(UUID)

私はデータベースにメッセージシーケンスを保存しています。各シーケンスには最大N個のメッセージを含めることができます。メッセージシーケンスを表し、メッセージシーケンスが存在するかどうかをより速くチェックできるようにするハッシュ関数を作成したいと思います。

各メッセージには、大文字と小文字が区別される英数字のユニバーサル一意ID(UUID)があります。次のメッセージを検討してください_(M1, M2, M3)_ with ids-

_M1 - a3RA0000000e0taBB M2 - a3RA00033000e0taC M3 - a3RA0787600e0taBB_

メッセージシーケンスは

Sequence-1 : (M1,M2,M3) Sequence-2 : (M1,M3,M2) Sequence-3 : (M2,M1,M3) Sequence-4 : (M1,M2) Sequence-5 : (M2,M3) ... etc.。

以下は、メッセージシーケンスを保存するためのデータベース構造の例です。

enter image description here

メッセージシーケンスが与えられた場合、そのメッセージシーケンスがデータベースに存在するかどうかを確認する必要があります。たとえば、メッセージシーケンス_M1 -> M2 -> M3_、つまりUID _(a3RA0000000e0taBB -> a3RA00033000e0taC -> a3RA0787600e0taBB)_がデータベースに存在するかどうかを確認します。

テーブルの行をスキャンする代わりに、メッセージシーケンスをハッシュ値で表すハッシュ関数を作成したいと思います。テーブルでハッシュ値ルックアップを使用すると、おそらくより高速になります。

私の単純なハッシュ関数は- enter image description here

メッセージシーケンスハッシュをより速く保存するための最適なハッシュ関数は何であるか疑問に思っています。

7
EngineeredBrain

本格的な暗号化ハッシュは必要ありません。高速なものだけなので、FastHashを見てみてはどうでしょうか: https://github.com/ZilongTan/Coding/tree/master/fast-hash 。 32ビットまたは64ビットのハッシュでは不十分である(つまり、衝突が多すぎる)と思われる場合は、より長いMurmurHashを使用できます: https://en.wikipedia.org/wiki/MurmurHash (実際には、 FastHashの作成者はこのアプローチを推奨しています)

ウィキペディアには他のアルゴリズムのリストがあります: https://en.wikipedia.org/wiki/List_of_hash_functions#Non-cryptographic_hash_functions

いずれにせよ、ビット演算(SHIFT、XOR ...)を使用したハッシュは、最新のマシンであっても、アプローチの乗算よりも高速である必要があります。

4
memo

MD5アルゴリズム を使用して、messageUIDの連結文字列のハッシュを生成するのはどうですか。

たとえば、メッセージを検討してください

M1 - a3RA0000000e0taBB M2 - a3RA00033000e0taC M3 - a3RA0787600e0taBB

メッセージシーケンスの場合、M1->M2->M3文字列はa3RA0000000e0taBB;a3RA00033000e0taC;a3RA0787600e0taBBになり、MD5ハッシュは176B1CDE75EDFE1554888DAA863671C4になります。

この回答 によると、MD5は衝突に対して堅牢です。与えられたシナリオでは、セキュリティは必要ないので、MD5で十分かもしれません。

2
EngineeredBrain

メッセージUUIDの連結に適用される通常の文字列ハッシュアルゴリズム(たとえば、選択した言語のベースライブラリ文字列ハッシュ)は、そのハッシュによってすべてのメッセージを選択し、それらが実際に正しい順序のメッセージであることを確認する限り、十分です。これは、通常シーケンスに含まれるメッセージの数に応じて効率的である場合とそうでない場合があります(最悪の場合についても考えてください)。一般に、衝突のないハッシュ計算を保証する方法はないため、衝突が発生した場合に何をするかを考える必要があります。さて、これを最適化してハッシュが一意であることを確認したい場合は、状況によっては可能かもしれません。データを挿入しようとすると衝突についてわかるので、それについて何かを行うことができます(たとえば、シーケンスにソルトまたはダミーメッセージを適用するか、ハッシュを変更して、取得するまでそれを続けます。空のスポット)、ただし、十分に大きなハッシュと、場合によっては他のアプリ固有の変更が必要になります。

0
vladich