2015-02-10 130 views
0

我有一個python哈希函數,我試圖用相同的哈希值得到10個密鑰,但是我找不到。具有相同哈希值的python哈希函數

這裏是我的功能:

import math 
def h(x): 
    return math.floor((2**14)*((x*2654435769.0/(2**32)) %1)) 
+0

你能解釋一下你想要做什麼。示例輸入和預期輸出。 – Marcin 2015-02-10 02:00:25

+0

在你的代碼中,你做的是mod 1,它根本沒有意義,因爲它總是會導致0.你也乘以結果。根據你的區塊中的代碼,你可能會返回0,這是沒有意義的。如果您正在嘗試查找多個會導致相同散列值的值,則完全取決於您使用的散列函數。任何常用的散列函數都設計得非常精巧,可以防止(碰撞),而不需要大量的計算時間。 – Goblinlord 2015-02-10 02:34:30

+0

我可以採取一些整數輸入像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

回答

0

我已經修改了你的哈希函數返回一個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] 
+0

哦,謝謝。這很酷 – Nick 2015-02-10 03:21:37