bloom filter

87 阅读1分钟
import hashlib

class BloomFilter:
    def __init__(self, size, num_hashes):
        """初始化Bloom过滤器
        :param size: 位数组的大小
        :param num_hashes: 使用的哈希函数数量
        """
        self.size = size  # 位数组大小
        self.num_hashes = num_hashes  # 哈希函数数量
        self.bit_array = [0] * size  # 位数组初始化为0

    def _hashes(self, item):
        """计算哈希值,返回多个哈希值"""
        result = []
        for i in range(self.num_hashes):
            # 使用不同的哈希函数,每个函数基于不同的盐值
            hash_value = int(hashlib.md5((str(i) + item).encode('utf-8')).hexdigest(), 16)
            result.append(hash_value % self.size)
        return result

    def add(self, item):
        """向Bloom过滤器添加元素"""
        for hash_value in self._hashes(item):
            self.bit_array[hash_value] = 1  # 标记对应的位为1

    def contains(self, item):
        """检查元素是否存在于Bloom过滤器中"""
        for hash_value in self._hashes(item):
            if self.bit_array[hash_value] == 0:
                return False  # 只要有一个哈希位置是0,说明该元素肯定不在集合中
        return True  # 如果所有的哈希位置都是1,可能在集合中

# 使用示例
if __name__ == "__main__":
    # 初始化 Bloom Filter,大小为 1000,使用 5 个哈希函数
    bloom = BloomFilter(size=1000, num_hashes=5)

    # 向 Bloom Filter 中添加元素
    bloom.add("apple")
    bloom.add("banana")
    bloom.add("grape")
    print(bloom.bit_array)

    # 检查元素是否在 Bloom Filter 中
    print("apple in filter?", bloom.contains("apple"))  # 输出: True
    print("banana in filter?", bloom.contains("banana"))  # 输出: True
    print("orange in filter?", bloom.contains("orange"))  # 输出: False