ランダムに生成された一意の ID が 100 万個あります。
私が行った場合:
result = int(hash(id + 'some_salt')) % 1000
次に、これにより、ID が 0 から 999 の間の整数に均等に分散され、各整数に約 1000 の ID がマップされます。
これにソルトを追加して、ハッシュを再度取得すると、次のようになります。
x = int(hash(id)) % 1000
result = int(hash(str(x) + 'some_salt') % 1000)
その結果、分布は完全に不均一になります。各 ID の結果はもちろん [0,999] の範囲ですが、この範囲内の一部の整数には ID がマップされていませんが、他の整数には数千の ID がマップされています。
これにより、値の分布が非常に不均一になるのはなぜですか?
これを調整して、100 万の ID と特定のソルトに対して [0,999] の範囲の整数が均一に分布するようにするにはどうすればよいですか? 潜在的に非常に大きな入力スペースをより小さなスペース (サイズ 1000 など) に縮小する中間ステップを維持したいと考えています。
SHA-256 ハッシュを使用しています。
非常に不均一な結果を示す Python コードを次に示します。
import numpy as np
import hashlib
OUTPUT_RANGE_SIZE = 1000
unique_ids = xrange(1000000) # sequential here, but could be any kind of unique ids
frequencies = np.zeros(OUTPUT_RANGE_SIZE, dtype='int')
for idx in xrange(len(unique_ids)):
id = unique_ids[idx]
hash_mod = int(hashlib.sha256(str(id)).hexdigest(), 16) % 1000
result = int(hashlib.sha256(str(hash_mod) + 'some_salt').hexdigest(), 16) % OUTPUT_RANGE_SIZE
frequencies[result] = frequencies[result] + 1
print frequencies