Python中的“可哈希”是什么意思?

351 投票
10 回答
261542 浏览
提问于 2025-04-17 13:44

在Python代码中,说一个对象是可哈希的,到底是什么意思呢?

10 个回答

35

任何不可变的东西(不可变的意思是,不容易改变)都可以进行哈希处理。除了要找哈希函数之外,如果一个类有这个功能,可以通过比如说 dir(tuple) 来查看,看看里面有没有 __hash__ 这个方法。下面是一些例子:

#x = hash(set([1,2])) #set unhashable
x = hash(frozenset([1,2])) #hashable
#x = hash(([1,2], [2,3])) #tuple of mutable objects, unhashable
x = hash((1,2,3)) #tuple of immutable objects, hashable
#x = hash()
#x = hash({1,2}) #list of mutable objects, unhashable
#x = hash([1,2,3]) #list of immutable objects, unhashable

不可变类型的列表:

int, float, decimal, complex, bool, string, tuple, range, frozenset, bytes

可变类型的列表:

list, dict, set, bytearray, user-defined classes
167

这里的所有回答都很好地解释了Python中可哈希对象的概念,但我觉得首先需要理解“哈希”这个词。

哈希是计算机科学中的一个概念,用来创建高效的、伪随机访问的数据结构,这种结构可以快速存储和访问大量数据。

举个例子,如果你有10,000个电话号码,想把它们存储在一个数组里(数组是一种顺序的数据结构,它把数据存放在连续的内存位置,并且可以随机访问),但你可能没有足够的连续内存空间。

所以,你可以使用一个大小为100的数组,并用一个哈希函数把一组值映射到相同的索引上,这些值可以存放在一个链表里。这样做的性能和数组差不多。

哈希函数可以很简单,比如用数字除以数组的大小,然后取余数作为索引。

想了解更多细节,可以参考这个链接:https://en.wikipedia.org/wiki/Hash_function

这里还有一个不错的参考资料:http://interactivepython.org/runestone/static/pythonds/SortSearch/Hashing.html

280

来自Python 词汇表的内容:

一个对象是“可哈希”的,意思是它有一个在整个生命周期内都不会改变的哈希值(这需要一个 __hash__() 方法),并且可以和其他对象进行比较(这需要一个 __eq__()__cmp__() 方法)。如果两个可哈希的对象比较后是相等的,它们的哈希值也必须相同。

可哈希性使得一个对象可以用作字典的键和集合的成员,因为这些数据结构在内部使用哈希值。

Python 中所有不可变的内置对象都是可哈希的,而可变的容器(比如列表或字典)则不是。用户自定义类的实例默认是可哈希的;它们之间比较后都是不相等的,哈希值就是它们的 id()

撰写回答