0
我有一個python哈希函數,我試圖用相同的哈希值得到10個密鑰,但是我找不到。具有相同哈希值的python哈希函數
這裏是我的功能:
import math
def h(x):
return math.floor((2**14)*((x*2654435769.0/(2**32)) %1))
我有一個python哈希函數,我試圖用相同的哈希值得到10個密鑰,但是我找不到。具有相同哈希值的python哈希函數
這裏是我的功能:
import math
def h(x):
return math.floor((2**14)*((x*2654435769.0/(2**32)) %1))
我已經修改了你的哈希函數返回一個int
,而不是float
。而且我已經預先定義了這些常量,因此在每次調用函數時都不需要計算它們。
(編輯常數的預定義可能不是嚴格必要的,Python的常量摺疊可之後找我們。)
我們通過餵食隨機X的的功能和存儲結果發現碰撞在列表的字典中,散列值作爲字典鍵,x存儲在列表中。爲了保持代碼簡單,我使用了defaultdict,但代碼可以很容易地修改爲使用標準字典。
下面的代碼可以在幾秒鐘內找到10個碰撞鍵的列表。
#!/usr/bin/env python
import math
import random
import sys
from collections import defaultdict
k14 = 1 << 14
phibar = 2654435769.0/(1 << 32)
def h(x):
return int(math.floor(k14 * ((x * phibar) % 1)))
#random.seed(163)
hi = sys.maxint
rand = random.randint
d = defaultdict(list)
for i in range(100000):
x = rand(0, hi)
v = h(x)
d[v].append(x)
if len(d[v]) == 10:
print i
print v, d[v]
break
典型輸出
26580
4695 [2117596615, 363105812, 629092494, 1450847021, 749292969, 1735204492, 21338856, 1153043351, 1047107585, 138752460]
哦,謝謝。這很酷 – Nick 2015-02-10 03:21:37
你能解釋一下你想要做什麼。示例輸入和預期輸出。 – Marcin 2015-02-10 02:00:25
在你的代碼中,你做的是mod 1,它根本沒有意義,因爲它總是會導致0.你也乘以結果。根據你的區塊中的代碼,你可能會返回0,這是沒有意義的。如果您正在嘗試查找多個會導致相同散列值的值,則完全取決於您使用的散列函數。任何常用的散列函數都設計得非常精巧,可以防止(碰撞),而不需要大量的計算時間。 – Goblinlord 2015-02-10 02:34:30
我可以採取一些整數輸入像1,5,10,11。其實任何數字都可以。如果我使用h()來處理數字x和y,它們與h(x)== h(y)相同,那麼它們具有相同的散列值。我需要找到10個數字h(x)== h(y)== h(z)== h(a)== h(b)等找出x,y,z,a,b的值etc. – Nick 2015-02-10 02:38:27