在Python中,hash()是一个内置函数,它用于获取一个对象的哈希值。哈希值是一个固定长度的整数,用于表示一个对象的状态或标识,通常用于构建字典、集合等数据结构,以及进行数据加密等方面。
所有的不可变类型都具有可哈希性,包括数字、字符串、元组等,而可变类型如列表、字典、集合等则没有可哈希性。
使用哈希函数 hash() ,可以将对象转换成哈希值。
哈希函数具有以下特点:
输入相同的数据,输出的哈希值必定相同 (前提:在一次运行中是不变的。如果是多次运行,那么相同数据的哈希值是不同的);
输入不同的数据,输出的哈希值也应该尽量不同;
哈希值的长度是固定的。
常见的hash算法:
1、除法哈希算法
2、乘法哈希算法
3、平方取中法
3、随机数哈希算法
哈希表
参考:Python中的哈希表_python3哈希表_Echo_Wish的博客-CSDN博客
哈希表是一种数据结构,它能够在O(1)时间内进行查找、插入和删除操作。
Python中提供了字典(dict)类型来实现哈希表。字典是一种包含键值对的可变集合,支持常数时间的插入、查找、和删除操作。
hash_table = {}
# Insert
hash_table['apple'] = 1
hash_table['banana'] = 2
hash_table['cherry'] = 3# Lookup
print(hash_table['apple']) # 1
print(hash_table['banana']) # 2
print(hash_table['cherry']) # 3# Delete
del hash_table['banana']
print(hash_table) # {'apple': 1, 'cherry': 3}
在以上示例中,我们首先创建一个空的字典(hash_table),接着向其插入三对关键字/值对。我们可以使用键来查找对应的值(如hash_table['apple']返回1),也可以使用del语句删除某个键(如del hash_table['banana'])。整个操作过程在常数时间内完成,因为Python实现了哈希表来支持这些操作。
除了Python中的字典,哈希表也可以自己实现。以下是一个使用Python列表和哈希函数来创建简单哈希表的示例:
hash_table = [None] * 10 # 初始大小为10的哈希表,初始值为None
def hash_function(key):
return hash(key) % len(hash_table) # 使用Python内置哈希函数,对哈希表大小进行取模# Insert
key = 'apple'
value = 1
index = hash_function(key)
hash_table[index] = value# Lookup
key = 'apple'
index = hash_function(key)
print(hash_table[index]) # 1# Delete
key = 'apple'
index = hash_function(key)
hash_table[index] = None
以上实现中,我们首先创建一个长度为10的哈希表(hash_table)。哈希函数使用Python的内置哈希函数,并对哈希表大小进行取模操作。插入操作首先通过哈希函数获取关键字'apple'的索引,然后将值1插入到哈希表的这个位置(hash_table[index] = value)。查找操作和删除操作也依据关键字和哈希函数找到相应的位置,并进行操作。
为解决哈希冲突,介绍两种常用的方法:
开放寻址法
如果哈希函数返回的位置处已经有值存在,则向后寻找新的位置来存储这个值
线性探测:如果位置 被占用,则探查
二次探测:如果位置 被占用,则探查
二度哈希:有 个哈希函数,当使用第一个哈希函数发生冲突时,则尝试使用
代码示例: python计算哈希值 python中哈希表用法_mob64ca13fe9c58的技术博客_51CTO博客
链表法(哈希链表法 Hash Linked List)
哈希表的每一个位置都以链表的形式来对值进行存储,当冲突发生时,冲突的元素被存储到链表的末端。