具有相同哈希值的python哈希函数

时间:2015-02-10 01:58:43

标签: python hash

我有一个python哈希函数,我试图获得具有相同哈希值的10个密钥,但我无法找到。

这是我的功能:

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

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]