zircote / bloom
PHP/Redis 布隆过滤器实验
dev-master
2013-12-17 01:38 UTC
Requires
- rediska/rediska: master-dev
This package is not auto-updated.
Last update: 2024-09-14 14:09:04 UTC
README
该项目从尝试编写“纯”PHP布隆过滤器演变为一款工具,该工具使用 Redis
和 Rediska
作为分布式 布隆过滤器
的存储和接口。
通过利用 Redis 的 SETBIT
和 GETBIT
功能,我们能够创建一个简单、强大且轻量级的布隆过滤器。Redis 可以创建一个实际上无限大小的 BITSET(512MB),为我们提供的索引限制非常大。在测试和研究的早期阶段,PHP_INT_MAX 被很好地用作一条分界线。在足够多的哈希桶数的情况下,这可能导致 10b 值的 3% 错误率。(我在过于自信地得出这些结论之前还会对这些数字进行更多测试。)
基准测试中的读取时间:使用包含 27607 个唯一字符串的单词列表进行三个键哈希时,为 0.0011499519820647/s。
基准测试中的添加时间:使用包含 27607 个唯一字符串的单词列表进行三个键哈希时,为 0.0036964981654479/s。
<?php use Bloom\Filter, Bloom\Hash\HashMix, Bloom\Hash\Murmur, Rediska; /* Create the Filter */ $filter = new Filter(); /* Inject Rediska */ $filter->setRediska(new Rediska()); /* Inject the Hash Class */ if(extension_loaded('murmurhash')){ $filter->setHash(new Murmur()); } else { $filter->setHash(new HashMix()); } /* Add items to the filter */ $filter->add('some random text'); $filter->add(array('or add','an array of elements')); /* Check the filter */ var_dump($filter->contains('some random text')); // bool(true) var_dump($filter->contains('or add')); // bool(true) var_dump($filter->contains('This is not in the filter')); // bool(false) var_dump($filter->contains(array('or add','an array of elements'))); // bool(true) var_dump($filter->contains(array('NO','or add','an array of elements'))); // bool(false)