【python】python-可哈希对象与不可哈希对象
对于哈希一词,想必大家都不陌生。哈希值、哈希算法、可哈希、不可哈希、哈希表中总有一个你熟悉的面孔。那哈希(hash)到底是什么意思呢?今天就好好总结一下!
什么是hashable(可哈希性)
An object is hashable if it has a hash value which never changes during its lifetime (it needs a hash() method), and can be compared to other objects (it needs an eq()or cmp() method). Hashable objects which compare equal must have the same hash value.
如果一个对象是可哈希的,那么在它的生存期内必须不可变(而且该对象需要一个哈希函数),而且可以和其他对象比较(需要比较方法).比较值相同的对象一定有相同的哈希值,即一个对象必须要包含有以下几个魔术方法:
__eq__()
:用于比较两个对象是否相等__cmp__():
用于比较两个对象的大小关系,它与__eq__只要有一个就可以了__hash__():
实际上就是哈希函数(散列函数),返回经过运算得到的哈希值
可哈希的数据类型
即不可变的数据结构
(数字类型(int,float,bool)字符串str、元组tuple、自定义类的对象)。
对于不可变类型而言,不同的值意味着不同的内存,相同的值存储在相同的内存,可以将我们的不可变对象理解成哈希表
中的Key,将内存理解为经过哈希运算的哈希值Value。
不可哈希的数据类型
即可变的数据结构
(字典dict,列表list,集合set)
对于可变对象而言,比如一个列表,更改列表的值,但是对象的地址本身是不变的,也就是说不同的Key,映射到了相同的Value,这显然是不符合哈希值的特性的,即出现了哈希运算里面的冲突。