乗算ハッシュ法
ランダムな奇数を掛けて上部d桁を取り出す
整数 $ x∈\{1,2,3,…,2^w-1\} のハッシュ値は$ ((z\cdot x)\mod2^w) \ div \ 2^{w-d}になる
ハッシュテーブルの大きさは$ 2^d(dは整数)とする
zはランダムに選んだ奇数
$ z∈\{1,3,5,…,2^w-1\}
多分奇数なのは0を入れないため…?(知らんけど)
wはワードサイズ(16bitの16の部分)
divは割り算の切り捨て(C++でいう / に相当)
C++とかだとでかい数字で掛け算した時に勝手にはみ出した上の桁がどっかいくし、2^{w-d}で割る作業は実質シフトと同じなので
code:実質.cpp
hashx = (z*x) >> (w-d);