2011-12-01 114 views
3

即时通讯尝试在python中实现一个哈希函数。你会考虑以下一个真正的散列函数吗?我从110桶和值7,它还将计算碰撞:)量这是一个哈希函数吗? python

import random 

A=[1,2,3,4,5,6,7] 
hashed=[] 

def func(): 
    i=0 
    count=0 
    while len(A)>i: 
      m=random.randint(1,10) # 10 buckets 
      if m in hashed: 
      count+=1 
      hashed.append(m) 
      print "element:",A[i], "hashed to bucket", m 
      i+=1 


    print "Amount of collisions:", count 


func() 

测试:

element: 1 hashed to bucket 3 
element: 2 hashed to bucket 2 
element: 3 hashed to bucket 10 
element: 4 hashed to bucket 8 
element: 5 hashed to bucket 3 
element: 6 hashed to bucket 10 
element: 7 hashed to bucket 4 
Amount of collisions: 2 

编辑:

我看了所有的评论和试图创建另一个散列函数。这次我使用随机确定要被哈希的键。这次我只有3个水桶。我会尝试与25个值是1和10:

import random 


count=[] 

list1 = [] # bucket 1 
list2 = [] # bucket 2 
list3 = [] # bucket 3 

the_list = [] 
the_list.append(list1) 
the_list.append(list2) 
the_list.append(list3) # using lists within a list 


def func(): 
    while True: 
     number=random.randint(1,10) 
     i=random.randint(0,len(the_list)-1) 
     the_list[i].append(number) 
     count.append(number) 
     if len(count)>25: # testing for 25 values 
      break 

func() 
print "Bucket 1:", the_list[0] 
print "Bucket 2:", the_list[1] 
print "Bucket 3:", the_list[2] 

测试:

Bucket 1: [5, 9, 8, 10, 3, 10] 
Bucket 2: [10, 5, 8, 5, 6, 2, 6, 1, 8] 
Bucket 3: [9, 4, 7, 2, 1, 6, 7, 10, 9, 1, 5] 
+0

当你需要检索元素时,你会如何确定元素的位置?你在那里引入了randonmess,下一次你有'1'可以用“bucket 10”来代替,但是oops ......它真的在第3桶。 –

+0

@John:你的测试输出不可能来从你发布的代码。 count对func()是本地的,并且在运行func之前打印碰撞计数。在这里可以很容易地看到可能发生的情况,但总的来说,总是要确保发布独立的例子,这些例子在单独运行时生成输出。 – DSM

+0

是的,我忘了为最后一次打印创建空间,打印语句在我的程序中的func里面。虽然信息ty。 – John

回答

4

编号散列函数必须是确定性的。它不能依赖随机性。

散列过程必须是确定性的 - 这意味着对于给定的输入值,它必须始终生成相同的散列值。换句话说,从术语的数学意义上讲,它必须是散列数据的函数。此要求不包括取决于外部变量参数的散列函数,例如伪随机数生成器或一天中的时间。它还排除依赖于被哈希对象的内存地址的函数,因为该地址在执行过程中可能会发生变化(可能会发生在使用某些垃圾收集方法的系统上),尽管有时可能会重新哈希该项目。

来源:Hash function - Determinism(维基百科)

+0

谢谢。我误导了,你有什么建议如何在Python中创建一个简单的哈希函数? – John

+3

下面是一个简单的散列函数来散列一个整数:f(x):return x%10 –

+0

@John:你的修改后的例子用整数随机填充一些数组。没有可能被散列的输入。你需要什么散列函数? – Dennis

0

散列函数需要给出相同的输入相同的输出...你只是给了一个随机的数。所以,我不认为它是一个真正的哈希函数,不。

0

号您还没有做任何散列可言,简单地随机粘附值到一个数组。散列函数接受输入并返回确定性值。该返回值是散列。

0

不,这不是一个哈希函数。散列函数将一个较大的数据集中的元素映射到一个较小的数据集。这只是随机地将数字插入到列表中。

1

不,这不是一个哈希函数。给定一个输入的哈希函数应该再一次给出相同的输出结果&。

而不是构建自己的散列函数,为什么不在Python本身中使用hash。 Python具有内置的哈希实现。

>>> hash("xyz") 
-5999452984703080694 

因此,而不是使用list使用与hash一个dict与关键的是这个散列输出。混淆可以很容易被发现。

+0

我会尽力,谢谢 – John