这是哈希函数吗?蟒蛇

时间:2011-12-01 16:26:18

标签: python function hash

我试图在python中实现一个哈希函数。你会考虑以下真正的哈希函数吗?我有10个桶和1到7的值。它还会计算碰撞量:)

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

编辑:

我查看了所有评论,并尝试创建另一个哈希函数。这次我使用random来确定要散列的键。这次我只有3个水桶。我将尝试使用介于1和10之间的25个值:

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]

5 个答案:

答案 0 :(得分:4)

否。哈希函数必须是确定性的。它不能依赖随机性。

  

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

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

答案 1 :(得分:1)

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

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

>>> hash("xyz")
-5999452984703080694

因此,不要使用list使用带有dict的{​​{1}},而密钥是此哈希输出。可以很容易地检测到共谋。

答案 2 :(得分:0)

哈希函数需要为同一输入提供相同的输出...你只需给出一个随机数。所以,我不认为这是一个真正的哈希函数,没有。

答案 3 :(得分:0)

没有。您根本没有进行任何散列,只需将值随机粘贴到数组中即可。哈希函数接受输入并返回确定性值。该返回值是哈希值。

答案 4 :(得分:0)

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