📅  最后修改于: 2023-12-03 15:10:20.169000             🧑  作者: Mango
在计算机编程中,杂凑(哈希)是一种用于将信息(如大型文件)压缩成固定长度散列(哈希值)的技术。哈希值通常用于校验文件的完整性或比较文件,但它们也广泛用于数据结构中,如哈希表和布隆过滤器。
哈希表是一种常用的数据结构,它通过键值对的方式存储数据。哈希表中的键通过哈希函数转换成对应的哈希值,而哈希值则对应着值所在的位置。由于哈希函数是在键的基础上计算的,因此相同的键一定会被映射到相同的哈希值上,从而实现快速查找和插入操作。
哈希表的主要优点是快速查找和插入,但它也有一些限制,如:
以下是使用Python语言实现哈希表的一个示例:
class HashTable:
def __init__(self):
self.size = 10
self.table = [[] for _ in range(self.size)]
def _hash(self, key):
return hash(key) % self.size
def set(self, key, value):
hash_value = self._hash(key)
for i, (k, v) in enumerate(self.table[hash_value]):
if k == key:
self.table[hash_value][i] = (key, value)
return
self.table[hash_value].append((key, value))
def get(self, key):
hash_value = self._hash(key)
for k, v in self.table[hash_value]:
if k == key:
return v
return None
在上述代码中,哈希表中存储的是一个列表,列表的每个元素又是由键值对组成的元组。哈希表的查询操作需要使用哈希函数计算出键对应的哈希值,从而快速定位到对应的位置。
布隆过滤器是一种基于哈希的数据结构,它可以对大规模数据进行快速的查找和插入操作。布隆过滤器通过多个哈希函数对输入进行计算,从而将其映射到多个位置上。当需要查询某个值是否存在时,只需要检查其对应的位置上是否都为1即可,如果存在一个位置为0,则说明该值一定不存在。
布隆过滤器的主要优点是快速查找和插入,但它有一定的误判率,即可能将不存在的值误认为存在。因此,布隆过滤器一般用于快速判断某个值是否存在,而不用于精确判断。
以下是使用Python语言实现布隆过滤器的一个示例:
import hashlib
class BloomFilter:
def __init__(self, size, functions):
self.size = size
self.functions = functions
self.bits = [0] * size
def _hash(self, value):
value = str(value).encode('utf-8')
for func in self.functions:
hash_value = int(hashlib.sha256(value + func).hexdigest(), 16)
yield hash_value % self.size
def add(self, value):
for i in self._hash(value):
self.bits[i] = 1
def __contains__(self, value):
return all(self.bits[i] for i in self._hash(value))
在上述代码中,布隆过滤器使用了多个哈希函数,每个哈希函数都会将输入计算成一个哈希值。布隆过滤器中的每个元素则对应着多个位置上的比特位,当需要查询某个元素是否存在时,布隆过滤器会检查其对应的多个位置上是否都为1,如果是则说明该元素可能存在,如果不是则说明该元素一定不存在。