0からupperlimit
(除外)までのスペースに最大2つの数字を配置するには、その距離をupperlimit
の約半分に設定します。 Pythonで
それは(そうでなければ、最後の要素は、衝突、upperlimit
が偶数である場合、コードのみ動作)このようになります。
def my_hash(n, upperlimit):
return n * upperlimit/2 % upperlimit + n/2
def my_unhash(n, upperlimit):
return n % (upperlimit/2) * 2 + n/(upperlimit/2)
例の結果は:
upperlimit = 16
for i in range(upperlimit):
h = my_hash(i, upperlimit)
u = my_unhash(h, upperlimit)
print "%02d -> %02d -> %02d" % (i, h, u)
00 -> 00 -> 00
01 -> 08 -> 01
02 -> 01 -> 02
03 -> 09 -> 03
04 -> 02 -> 04
05 -> 10 -> 05
06 -> 03 -> 06
07 -> 11 -> 07
08 -> 04 -> 08
09 -> 12 -> 09
10 -> 05 -> 10
11 -> 13 -> 11
12 -> 06 -> 12
13 -> 14 -> 13
14 -> 07 -> 14
15 -> 15 -> 15
は、2番目の列は、ハッシュを示し値。必要に応じて0を除外することができます。なぜなら、それ自体にマップするからです。
接頭辞間の最小「距離」は許容されますか? – diginoise
ハード制限はありません。基本的に私はより広い範囲で連続番号を広げる必要があります。 –
奇数によるモジュラ乗算は全単射であり、その範囲内にとどまります(0はそれ自身にマップされるので、入力範囲にないと出力範囲には入りません) – harold