在Python中对数组进行哈希化

87

你是指从数组中获取哈希值,还是指一种内部使用哈希的类似数组的数据结构? - juanchopanza
4个回答

79

试一下:

>>> hash((1,2,3))
2528502973977326415
>>> hash([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(frozenset((1,2,3)))
-7699079583225461316
>>> hash(set((1,2,3)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

由于元组(tuple)和冻结集合(frozenset)是不可变的,因此您可以获取它们的哈希值(hash),而对于可变对象列表(list)和集合(set),则无法获取其哈希值。


1
然而,元组的哈希似乎无法正常工作:hash((1,2,3))得到的结果是2528502973977326415,但是hash((1,2,4))也得到了2528502973976161366(在Python 2.7.9上测试)。 - cgogolin
33
价值观不同,但一切正常运作。 - Dmitry Shintyakov
60
哦,如果可以的话,我会给自己的评论投反对票。我只比较了哈希值的前几个数字,所以我欺骗了自己。 - cgogolin
14
不错的观察。这么多相同的数字不应该是巧合,这表明散列算法不太好。 - Ciro Santilli OurBigBook.com
28
哈希算法并不是非常好。具体取决于你需要用它来干什么。如果你要用它进行加密,那就不要使用它,因为哈希值与输入相关联。如果你需要快速获取一个哈希值以查找字典键,则这是一种完全可以接受的哈希算法。 - Him
@cgogolin,这就是为什么我总是比较md5sum中的前几个和后几个数字(十六进制?);虽然不是绝对可靠,但感觉还不错。也许有一天我会被烧伤... - SO_fix_the_vote_sorting_bug

36

如果你真的需要使用列表作为字典键,请尝试先将其转换为字符串。
my_list = str(my_list)


73
如果你要费心转换成另一种数据类型,使用元组会更有意义吧? - N. Virgo
3
对于包含更多列表的列表,递归转换为元组比简单的 str() 更不容易。 - Jari Turkia

9

Python不允许您在字典中使用可变数据作为键,因为插入后的更改会使对象无法被找到。您可以使用元组作为键。


8
有点不正确,一个用户自定义的类可以编写成可哈希的(因此能够作为字典中的键),但在Python中创建一个不可变的用户自定义类相当困难。 - Adam Parkin

2

首先你需要将它转换为元组:

print(hash(tuple([1, 2, 3, 4, 5, 6])))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接