这是哈希函数吗?python

3 投票
5 回答
1455 浏览
提问于 2025-04-17 07:29

我正在尝试在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

编辑:

我看了所有的评论,尝试创建另一个哈希函数。这次我用随机数来决定要哈希的键。这次我只有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]

5 个回答

0

不,你根本没有在进行任何哈希操作,只是在数组里随便放一些值。哈希函数是一个把输入变成固定输出的过程,这个输出就是哈希值。

1

不,这不是一个哈希函数。哈希函数的作用是对同一个输入,每次都能产生相同的输出。

与其自己去写一个哈希函数,不如直接使用Python自带的hash功能。Python里面已经有现成的哈希实现了。

>>> hash("xyz")
-5999452984703080694

所以,别用list,可以用dict,并且用hash,把这个哈希输出作为键。这样可以很容易地检测到冲突。

4

不可以。 哈希函数必须是确定性的,不能依赖随机性。

哈希过程必须是确定性的——这意味着对于一个给定的输入值,它必须总是生成相同的哈希值。换句话说,它必须是被哈希数据的一个函数,从数学的角度来看。这就要求哈希函数不能依赖外部的可变参数,比如伪随机数生成器或者时间。这也排除了那些依赖于被哈希对象的内存地址的函数,因为这个地址在执行过程中可能会改变(例如在使用某些垃圾回收方法的系统中),尽管有时对该项进行重新哈希是可能的)。

来源:哈希函数 - 确定性(维基百科)

撰写回答