hash算法

在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)
哈希表的每一个位置都以链表的形式来对值进行存储,当冲突发生时,冲突的元素被存储到链表的末端。

代码示例:哈希链表python_mob64ca12e51ecb的技术博客_51CTO博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值