zircote/bloom

PHP/Redis 布隆过滤器实验

dev-master 2013-12-17 01:38 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:09:04 UTC


README

Build Status

该项目从尝试编写“纯”PHP布隆过滤器演变为一款工具,该工具使用 RedisRediska 作为分布式 布隆过滤器 的存储和接口。

通过利用 Redis 的 SETBITGETBIT 功能,我们能够创建一个简单、强大且轻量级的布隆过滤器。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)

Bitdeli Badge