跳到主要内容
uencoder

Use Bloom filters 为集合 membership

Bloom filters probabilistically 测试集合 membership 具有否 假负 但可能假 正. Space-efficient 为大 sets.

  1. 1

    Bloom 过滤是 位数组的 m bits 和 k hash 函数. 到添加元素: 集合 bits 在 positions h1(x), h2(x),。.., hk(x) 到 1. 到测试 membership: 检查如果所有 k positions 是 1. 如果任何是 0, 元素是 肯定不 在集合. 如果所有是 1, 它是 可能在 集合 (假正 速率 p ≈ (1 - e^(-kn/m))^k).

  2. 2
    哈希计算器 →

    Use 多个 hash 函数 (或 one hash 具有不同 seeds) 到计算 k positions. 为 k=7, m=10000 bits, n=1000 elements: 假正 速率 ≈ 0.8%. Increase m 或 k 到缩减假 正. Use SHA-256 具有不同 salts 为每个 hash 函数.

  3. 3
    Murmur3 哈希 →

    Use MurmurHash3 (non-cryptographic, 快) 为 Bloom 过滤哈希. Bloom filters 不 need cryptographic hash 函数 — 它们 need 速度和 均匀分布. MurmurHash3, FNV-1a, 和 xxHash 是好 choices. Use k independent hash 函数 (或双 哈希: h1(x) + i*h2(x) 为 i = 0..k-1).

常见问题

如何 I 选择 m 和 k?
Given n elements 和 desired 假正 速率 p: m = -n*ln(p)/(ln(2))^2 bits, k = (m/n)*ln(2) hash 函数. 为 n=1M, p=1%: m ≈ 9.6M bits (1.2MB), k ≈ 7. 过滤我们 1.2MB 不管的 元素大小 — far 更少 than storing 1M strings.
能够 I 移除 elements 从 Bloom 过滤?
不从 标准 Bloom 过滤 — 设置 bits 到 0 可能 affect 其他 elements. Use counting Bloom 过滤 (counter 而非 bits) 到支持 deletion, 或 Cuckoo 过滤 (supports deletion, better space 效率). 为最多用例 (caching, deduplication), 不 supporting deletion 是 acceptable.

解决此任务的工作流

相关工具