我有一个python哈希函数,我试图获得具有相同哈希值的10个密钥,但我无法找到。
这是我的功能:
import math
def h(x):
return math.floor((2**14)*((x*2654435769.0/(2**32)) %1))
答案 0 :(得分:0)
我已修改您的哈希函数以返回int
而不是float
。而且我已经预先定义了常量,因此每次调用函数时都不需要计算它们。
(编辑常量的预定义可能不是绝对必要的,Python的常量折叠可能会照顾我们。)
我们通过向函数提供随机x并将结果存储在列表的dict中来找到冲突,其中散列值为dict键,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]