5.1 哈希函数的定义及其应用
哈希函数 是一个处理输入数据(或称为键)并返回固定大小的比特值的函数,这通常称为哈希或哈希值。哈希函数的主要用途是通过哈希表有效地分配数据,以便快速访问元素。
应用:
- 哈希表: 用于实现关联数组(在 Python 中称为字典),提供基于键的快速数据访问。
- 数据完整性检查: 哈希函数用于检查文件和数据的完整性(例如,MD5、SHA-1、SHA-256 算法)。
- 密码学: 哈希函数用于加密和生成数字签名的密码算法中。
- 搜索引擎: 用于数据索引和快速信息检索。
- 缓存管理: 用于组织缓存以快速找到数据。
在 Python 中使用哈希函数的示例:
# Python 中使用哈希函数的示例,应用于哈希表(字典)
data = {"apple": 1, "banana": 2, "cherry": 3}
# 获取键的哈希值
key = "banana"
hash_value = hash(key)
print(f"键 '{key}' 的哈希值: {hash_value}")
5.2 现实生活中的类比
通过哈希函数可以将一大组对象拆分成大致相等的组。而且,如果继续添加新对象,它们将继续均匀分布在这些组中。
假设你有1000个人,需要将他们分为30组。可以这样做。
方法1. 根据名字的首字母。
第一组包括名字以“A”开头的人,第二组包括名字以“B”开头的人,依此类推。规则“你所在的组是你名字的首字母”就是哈希函数。但使用这样的哈希函数,我们可能会在“A”组得到很多人,而在“E”组则很少。
方法2. 根据出生日期。
每月一号出生的人在第一组,二号出生的在第二组,以此类推。这样会有31组。第31组的人数将会比其他组少一半左右,但这样分组比第一种情况人群分布更均匀。
方法3. 手机号码
理想的方案是获取一个既尽可能随机(这样这些数字会均匀分布),又能始终快速计算并保持一致的数字。
让我们取电话号码的最后4位——这将产生10000种可能。然后将该数字整除以30。这样我们就有30个可能的余数:0, 1, 2, ..., 29。这就是我们的组号。
值得一提的是,几乎所有的哈希函数都使用整除的余数——这非常简单并允许控制需要拆分为多少组。
5.3 哈希函数的基本特性
好的哈希函数的基本特性:
确定性: 相同的哈希函数 对于相同的输入值总是应返回相同的哈希值
。
示例:
key = "example"
assert hash(key) == hash(key)
重要提示! assert 语句检查其右侧是否为真 True
。如果表达式不为真 False
,则会抛出异常。
均匀性: 好的哈希函数应在可能的哈希值范围内均匀地分配值,以避免碰撞。
Python 开发者的案例:在字典(dict 类)中,Python 的哈希函数 hash()
可以均匀地分配键。
计算效率: 哈希函数应快速高效,以避免插入和搜索操作的变慢。
Python 开发者的案例:Python 中的标准哈希函数实现了对不同类型的键的操作,例如字符串和数字。
碰撞最小化: 当 两个不同的键具有相同的哈希值 时,会发生碰撞。好的哈希函数应尽量减少碰撞的可能性。
Python 开发者的案例:SHA-256 算法在哈希数据时最小化了碰撞的可能性。
哈希的分布: 对于大数据量,哈希函数应确保在整个哈希表中均匀分布哈希值。
Python 开发者的案例:Python 中的标准哈希函数很好地处理了哈希表中键的分布。
5.4 哈希函数及其实现示例
哈希函数接收 任意大小的数据 并返回 固定大小的哈希值。让我们看看几个哈希函数的示例及其实现。
示例1:字符串的简单哈希函数
一种最简单的字符串哈希函数可以通过使用字符串字符代码之和实现:
def simple_hash(key):
hash_value = 0
for char in key:
hash_value += ord(char)
return hash_value % 1000 # 假设我们的表大小为1000
# 使用示例:
key = "example"
print(f"键 '{key}' 的哈希值: {simple_hash(key)}")
示例2:使用多项式哈希的字符串哈希函数
多项式哈希是一种更复杂但有效的技术:
def polynomial_hash(key, a=33, m=1000):
hash_value = 0
for char in key:
hash_value = (hash_value * a + ord(char)) % m
return hash_value
# 使用示例:
key = "example"
print(f"键 '{key}' 的哈希值: {polynomial_hash(key)}")
示例3:Python 中内置的哈希函数
Python 提供了内置函数 hash() 用于获取不同类型数据的哈希值:
key = "example"
print(f"键 '{key}' 的哈希值: {hash(key)}")
示例4:加密哈希函数(SHA-256)
加密哈希函数如 SHA-256 用于确保数据安全:
import hashlib
def sha256_hash(key):
return hashlib.sha256(key.encode()).hexdigest()
# 使用示例:
key = "example"
print(f"键 '{key}' 的哈希值: {sha256_hash(key)}")
5.5 哈希和其应用简介
哈希 是一种使用哈希函数将任意大小的输入数据转换为固定大小的哈希值的过程。哈希在计算机科学和编程中广泛用于优化和确保安全。
哈希的主要应用:
1. 哈希表(字典): 哈希表使用哈希函数来组织和快速访问数据。
data = {"apple": 1, "banana": 2, "cherry": 3}
key = "banana"
hash_value = hash(key)
print(f"键 '{key}' 的哈希值: {hash_value}")
2. 数据完整性检查: 哈希函数用于检查文件和数据的完整性。
示例:使用 SHA-256 检查文件完整性:
import hashlib
def get_file_hash(file_path):
hasher = hashlib.sha256()
with open(file_path, 'rb') as file:
buf = file.read()
hasher.update(buf)
return hasher.hexdigest()
file_hash = get_file_hash('example.txt')
print(f"文件的 SHA-256 哈希: {file_hash}")
3. 密码学和安全性: 哈希函数用于生成加密原语,如数字签名和密码哈希。
示例:使用 SHA-256 哈希密码:
import hashlib
def hash_password(password):
return hashlib.sha256(password.encode()).hexdigest()
password = "securepassword"
hashed_password = hash_password(password)
print(f"密码哈希: {hashed_password}")
4. 搜索引擎和索引: 哈希用于创建索引和快速搜索数据。
示例:创建文本搜索索引:
def create_index(text):
index = {}
for word in text.split():
word_hash = hash(word)
if word_hash not in index:
index[word_hash] = []
index[word_hash].append(word)
return index
text = "This is an example text for indexing"
index = create_index(text)
print(f"索引: {index}")
5. 缓存管理: 哈希用于组织缓存以快速找到数据。
示例:使用哈希函数的简单缓存:
cache = {}
def get_from_cache(key):
hash_key = hash(key)
return cache.get(hash_key, None)
def add_to_cache(key, value):
hash_key = hash(key)
cache[hash_key] = value
# 添加和获取缓存数据
add_to_cache("test_key", "test_value")
print(get_from_cache("test_key")) # 输出: test_value
GO TO FULL VERSION