这是散列函数吗?python
我正在尝试用python实现一个哈希函数。你会考虑下面的一个真正的哈希函数吗?我有10个桶,值从1到7。它还将计算碰撞的数量:) 测试: 编辑: 我查看了所有注释,并尝试创建另一个哈希函数。这次我使用random来确定要散列的键。这次我只有3个水桶。我将尝试使用25个介于1和10之间的值:这是散列函数吗?python,python,function,hash,Python,Function,Hash,我正在尝试用python实现一个哈希函数。你会考虑下面的一个真正的哈希函数吗?我有10个桶,值从1到7。它还将计算碰撞的数量:) 测试: 编辑: 我查看了所有注释,并尝试创建另一个哈希函数。这次我使用random来确定要散列的键。这次我只有3个水桶。我将尝试使用25个介于1和10之间的值: import random count=[] list1 = [] # bucket 1 list2 = [] # bucket 2 list3 = [] # bucket 3 the_lis
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]
测试:
哈希函数需要为相同的输入提供相同的输出。。。你的只是给出一个随机数。所以,我不认为它是一个真正的哈希函数,不。不。哈希函数必须是确定性的。它不能依赖随机性 哈希过程必须是确定性的,这意味着对于给定的输入值,它必须始终生成相同的哈希值。换句话说,它必须是散列数据的函数,从数学意义上来说。此要求不包括依赖于外部变量参数的哈希函数,例如伪随机数生成器或时间。它还排除了依赖于被散列对象的内存地址的函数,因为该地址在执行过程中可能会发生变化(在使用某些垃圾收集方法的系统上可能会发生这种情况),尽管有时可以对该项进行重新散列)
来源:(维基百科)不。你根本没有做任何散列,只是将值随机粘贴到数组中。散列函数接受输入并返回确定性值。返回值就是散列。不,这不是散列函数。散列函数将一个元素从较大的数据集映射到较小的数据集。这只是在列表中随机插入数字。不,这不是散列函数。给定输入的散列函数应反复给出相同的输出 为什么不在python中使用
hash
,而不是构建自己的哈希函数呢。Python内置了哈希实现
>>> hash("xyz")
-5999452984703080694
因此,不要使用
列表
而是使用dict
和散列
,其中键是该散列输出。合谋很容易被发现。在检索元素时,您如何确定元素的去向?你在那里介绍Randonmes,下一次你有“1”的时候,它可能会用“bucket 10”来代替,但是糟糕的是。。。它真的在bucket 3中。@John:你的测试输出不可能来自你发布的代码。count是func()的本地值,在运行func之前打印冲突计数。在这里很容易看到可能发生的情况,但通常要确保发布独立的示例,这些示例在自己运行时生成输出。是的,我忘记为最后一次打印创建空间,print语句在我的程序的func中。不过,您通常不需要在Python中实现哈希函数,因为您通常不需要自己执行哈希函数的任何操作。特别是,您不需要创建散列容器,因为有两个内置容器,分别称为dict
(关联映射)和set
(具有唯一性约束的集合)。谢谢。我被误导了,你对如何在python中创建一个简单的散列函数有什么建议吗?这里有一个简单的散列函数来散列一个整数:f(x):返回x%10@John:修改后的示例用整数随机填充某些数组。没有可以散列的输入。你需要哈希函数做什么?
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]
>>> hash("xyz")
-5999452984703080694