ハッシュ原理とグローバルの実装
1-ハッシュハッシュ紹介
グローバルハッシュハッシュ2、ユニバーサル
3-グローバルハッシュH \ mathcal {H} Hを構築
4-pythonの達成
1-ハッシュハッシュ紹介
ハッシュ関数y = H(k)は、Y = H(k)は、Y = H(k)は、固定長出力にハッシュアルゴリズムHHHのYYYを介して任意の長さのKKKの入力は、出力ハッシュ値は1です。共通のハッシュ関数は、YがH(K)=(a⋅k+ B)が私= H(K)=(\ CDOT K + B)\ MOD私= H(K)=(a⋅kを国防省=です+ B)modm、一般的に素数をMMM。
以下に示すように、衝突ハッシュ関数になりやすいので、| K | |> | Y | | K |> | Y | | K |> | Yドメインハッシュ関数がYYYの範囲であり、一般に、KKKの設けられていますH(K5)= H(K2)= H(K7)H(K_5)= H(K_2)= H(k_7)H(K5)= H(K2)= H(K7)、K5、K2、k7k_5、K_2 、k_7k5、K2、K7鎖(衝突)で:
ハッシュ関数については、基本的にそのハッシュ値がチェーンにそれらをリードし、同じように、入力のセットを見つけることができる、と線形複雑度がさらに高くなっているよりも、時には見え、リニアよりもより多くのハッシュのルックアップの時間理由。
グローバルハッシュハッシュ2、ユニバーサル
アイデア:問題を解決する1つの方法はランダムです。ハッシュ関数のセットからランダムに選択(ハッシュ関数のファミリ)。だから、ハッシュ関数は非常に低い効率であることを特定のハッシュ関数のための入力のセットを構築する他の方法がない、を選択します。
定義1:U \ mathcal {U} Uが定義されているドメイン、H \ mathcal {H} H、ハッシュ関数のセットであるUは、{0,1にマッピングされ、\ mathcal {U} Uとすることができる、...、M-1 } \ {0、1、...、M-1 \} {0,1、...、M-1}、すなわちH:U→{0,1、...、M-1}、H ∈Hh:\ mathcal {U} \ RIGHTARROW \ {0、1、...、M-1 \}、H \で\ mathcal {H} H:U→{0,1、...、M-1 }、h∈H。
定義2:∀x、yの\ FORALL X、y∀x場合、YはX≠Y-X \ NEQyx= yおよび満たす| {h∈H:H(X)= H(Y)} | = | H | M | \ {\ mathcal {H}でH \:H(X)= H(Y)\} | = \ FRAC {| \ mathcal {H} |} {M} | {h∈H:H(X)= H(Y)} | = M | H | H \ mathcal {H} Hはグローバルである(ユニバーサル)と呼ばれるが、です。
定義により2、HがH mathcal {H} Hを選択\ YYY、衝突XXXのその後確率としている(各再選択ハッシュ関数への入力があることに注意してください)からランダムに一様にある場合:
関数h(x)= H(y)の数は、すべての関数である= | H | M | Hは| = 1メートル\} {FRAC {関数h(x)= H(y)の数は、すべての関数です}
= \ Fracの{\ FRAC {| \ mathcal {H} |} {M}} {| \ mathcal {H} |} = \ Fracの{1} {M}すべての機能をh(x)= H(y)とします。 number関数= | H | M | H | = M1。
定理1:均一\ mathcal {H} H(H \ mathcal {H} Hは、ドメイン全体である)我々は今、その後、TTTにハッシュテーブルにNNN入力を置く場合、HHHを選択所与A Hからランダムにそこに、xxxに入ります
E [xおよびハッシュテーブル衝突におけるTの要素数]
ここでE [⋅] E [\ CDOT] E [⋅]意味期待。
上記の定理を証明することにより[定理1の重要性]、我々はそれを言うことができ、そこH \ mathcal {H} H場合は(平均的な意味で)ハッシュテーブルTTTにおける全フィールドの要素の最終的な分布が均一です。
定理1レッツCxC_ {X} Cxとの証拠が提供される、ハッシュテーブルとXXX TTT衝突におけるランダム要素の数を表します。
CXY = \ \左= {1IF H(X)= H(Y)0if H(X)≠H(Y)C_ {X-Y} {} {CR} {アレイを開始\
1&\ H(X)= H(y)の場合\\
0 \ H(X)\ NEQ H(Y)なら
\端{アレイ} \ right.Cxy = {10μFのH(X)= H(y)の場合、H(X)= H(Y)
まあ、
E [Cxの] = E [Σy∈T-xCxy] =Σy∈T-XE [Cxyの】直線=Σy∈T-X1M =(N-1)の1M所望の特性以来
E [C_x] - = E [\ sum_ {テキサス州Y \} C_ {X-Y}] \\
&= \ Sum_ {テキサス州Y \} E [C_ {X-Y}]&特性リニア所望ため\\
&= \ sum_ {テキサス州Y \} \ FRAC {1} {M} \\
&=(N-1)\ FRAC {1} {M} \\
&<\ FRAC {N} {M}。
\端{アレイ} E [Cxの] = E [Σy∈T-xCxy] =Σy∈T-XE [Cxyの] =Σy∈T-XM1 =(N-1)、M1
例:もし、N = 1、M = 2N = 1、M = 2N = 1、m = 2の場合、E [Cxの<12.E [C_x <\ FRAC {1} {2} .E [Cxの< 21。
3-グローバルハッシュH \ mathcal {H} Hを構築
定理2:以下の4段階の設定Hに従って\ mathcal {H} Hは、すべてのフィールドです。
(条件)注文MMMは素数に等しいです。
(初期準備)入力KKK書き込まR + 1R + 1R + 1桁:K = K = K =、ここki∈{0,1、...、M-1} K_I \で\ {0、1、 ...、M-1 \}ki∈{0,1、...、M-1}(KKK MMMによる16進数に相当)。
(ランダム)ランダムに選択し、A = A = A =、前記ai∈0,1、...、のM 1a_i \ {0、1、...、M-1}ai∈0,1、.. 、M-1。
(ハッシュ函数)HA(K)=(Σiは= 0I = RAI×KI)MOD mh_a(K)=(\ sum_ {i = 0} ^ {iは= R} a_iを\回K_I)\ MOD MHA(K) =(Σiは= 0I = RAI×KI)modm。
2証拠を参照してください。
4-pythonの達成
間違って見れば、自分のコードを書くために、私を修正。コードリンクします。https:次のように//github.com/VFVrPQ/LDP/blob/master/Components/UniversalHashing.py、そうでない場合は、完全なコードは次のとおりです。
輸入数学
輸入ランダム
クラスUniversalHashing:
「」」
G:プライム
D:ドメイン、[0、1、...、D-1]
LEN:G塩基の最大桁数
V:[0、1、...、D-1]における入力値を
ハッシュ関数:H_A()=((0)* K(0)+(1)* K(1)+ ... +(AS-1)* K(のみ-1))%G
「」」
デフ__init __(自己、G、D):
自己.__ G =
アサートG> = 2、G 'は2未満です'
アサート自己.__ isPrime(g)は、G 'はプライムではありません'
自己.__ D = D
自己.__ LEN = math.ceil(math.log(D)/ math.log(G))#Gバンド、ビットの最大数
自己.__ =自己.__ LEN * [0]#最初の長さ
#V [0、1、...、D-1]で、入力値であります
デフハッシュ(自己、V):
自己.__ランダム()#再生成A、Hを選択
アウト= self.calc(自己.__、V)
リターン自己.__、アウト
CALC H_A#(K)=((0)* K(0)+(1)* K(1)+ ... +(AS-1)* K(のみ-1))%G
デフCALC(自己、V):
アサートのみ()==自己.__のみ、「のみ(A)!=自己.__のみ "
K =自己.__ toBitList(V)
アウト= 0 どのくらいのお金鄭州中絶http://mobile.sgyy029.com/
私の範囲(自己.__ LEN)でのために:
アウト=(OUT + [I] * K [i])と%自己.__ G
アウト返します
デフ__randomness(自己):
#生成
私の範囲(自己.__ LEN)でのために:
自己.__ [I] = random.randint(0、自己.__ G-1)
デフ__toBitList(自己、V):
アサートV> = 0、 'V <0'
V == 0の場合:
リターン自己.__ LEN * [0]
Bitliste =自己.__男* [0]
私の範囲(自己.__ LEN)でのために:
bitList [I] = v%の自己.__ G
V = INT(V /自己.__ G)
リターンBitliste
デフ__isPrime(自己、V):
V <= 1の場合:
リターン偽
iに対して範囲(2、INT(math.sqrt(V))+ 1、1)で:
v%のiは0 ==場合:
リターン偽
trueを返します
テストのための#
__name__ == "__main__" の場合:
TIMES = 10
グラム= 29#プライム
D = 16#ドメイン
uhash = UniversalHashing(G、D)
H = G * [0]
#ランダムTIMES確認する:I範囲内(TIMES)について
X = random.randint(0、D-1)
_、= uhash.hashアウト(X)
H [OUT] + = 1
範囲内のiについて(G):
プリント(I、H [i])と