如何使用php+redis实现布隆过滤器


首先定义一个hash函数集合类,这些hash函数不一定都用到,实际上32位hash值的用3个就可以了,具体的数量可以根据你的位序列总量和你需要存入的量决定,上面已经给出最佳值。

class BloomFilterHash
{
    /**
     * 由Justin Sobel编写的按位散列函数
     */
    public function JSHash($string, $len = null)
    {
        $hash = 1315423911;
        $len || $len = strlen($string);
        for ($i=0; $i<$len; $i++) {
            $hash ^= (($hash << 5) + ord($string[$i]) + ($hash >> 2));
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * 该哈希算法基于AT&T贝尔实验室的Peter J. Weinberger的工作。
     * Aho Sethi和Ulman编写的“编译器(原理,技术和工具)”一书建议使用采用此特定算法中的散列方法的散列函数。
     */
    public function PJWHash($string, $len = null)
    {
        $bitsInUnsignedInt = 4 * 8; //(unsigned int)(sizeof(unsigned int)* 8);
        $threeQuarters = ($bitsInUnsignedInt * 3) / 4;
        $oneEighth = $bitsInUnsignedInt / 8;
        $highBits = 0xFFFFFFFF << (int) ($bitsInUnsignedInt - $oneEighth);
        $hash = 0;
        $test = 0;
        $len || $len = strlen($string);
        for($i=0; $i<$len; $i++) {
            $hash = ($hash << (int) ($oneEighth)) + ord($string[$i]); } $test = $hash & $highBits; if ($test != 0) { $hash = (($hash ^ ($test >> (int)($threeQuarters))) & (~$highBits));
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * 类似于PJW Hash功能,但针对32位处理器进行了调整。它是基于UNIX的系统上的widley使用哈希函数。
     */
    public function ELFHash($string, $len = null)
    {
        $hash = 0;
        $len || $len = strlen($string);
        for ($i=0; $i<$len; $i++) {
            $hash = ($hash << 4) + ord($string[$i]); $x = $hash & 0xF0000000; if ($x != 0) { $hash ^= ($x >> 24);
            }
            $hash &= ~$x;
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * 这个哈希函数来自Brian Kernighan和Dennis Ritchie的书“The C Programming Language”。
     * 它是一个简单的哈希函数,使用一组奇怪的可能种子,它们都构成了31 .... 31 ... 31等模式,它似乎与DJB哈希函数非常相似。
     */
    public function BKDRHash($string, $len = null)
    {
        $seed = 131;  # 31 131 1313 13131 131313 etc..
        $hash = 0;
        $len || $len = strlen($string);
        for ($i=0; $i<$len; $i++) {
            $hash = (int) (($hash * $seed) + ord($string[$i]));
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * 这是在开源SDBM项目中使用的首选算法。
     * 哈希函数似乎对许多不同的数据集具有良好的总体分布。它似乎适用于数据集中元素的MSB存在高差异的情况。
     */
    public function SDBMHash($string, $len = null)
    {
        $hash = 0;
        $len || $len = strlen($string);
        for ($i=0; $i<$len; $i++) {
            $hash = (int) (ord($string[$i]) + ($hash << 6) + ($hash << 16) - $hash);
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * 由Daniel J. Bernstein教授制作的算法,首先在usenet新闻组comp.lang.c上向世界展示。
     * 它是有史以来发布的最有效的哈希函数之一。
     */
    public function DJBHash($string, $len = null)
    {
        $hash = 5381;
        $len || $len = strlen($string);
        for ($i=0; $i<$len; $i++) {
            $hash = (int) (($hash << 5) + $hash) + ord($string[$i]);
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * Donald E. Knuth在“计算机编程艺术第3卷”中提出的算法,主题是排序和搜索第6.4章。
     */
    public function DEKHash($string, $len = null)
    {
        $len || $len = strlen($string);
        $hash = $len;
        for ($i=0; $i<$len; $i++) {
            $hash = (($hash << 5) ^ ($hash >> 27)) ^ ord($string[$i]);
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }

    /**
     * 参考 http://www.isthe.com/chongo/tech/comp/fnv/
     */
    public function FNVHash($string, $len = null)
    {
        $prime = 16777619; //32位的prime 2^24 + 2^8 + 0x93 = 16777619
        $hash = 2166136261; //32位的offset
        $len || $len = strlen($string);
        for ($i=0; $i<$len; $i++) {
            $hash = (int) ($hash * $prime) % 0xFFFFFFFF;
            $hash ^= ord($string[$i]);
        }
        return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF;
    }
}

接着就是连接redis来进行操作

/**
 * 使用redis实现的布隆过滤器
 */
abstract class BloomFilterRedis
{
    /**
     * 需要使用一个方法来定义bucket的名字
     */
    protected $bucket;

    protected $hashFunction;

    public function __construct($config, $id)
    {
        if (!$this->bucket || !$this->hashFunction) {
            throw new Exception("需要定义bucket和hashFunction", 1);
        }
        $this->Hash = new BloomFilterHash;
        $this->Redis = new YourRedis; //假设这里你已经连接好了
    }

    /**
     * 添加到集合中
     */
    public function add($string)
    {
        $pipe = $this->Redis->multi();
        foreach ($this->hashFunction as $function) {
            $hash = $this->Hash->$function($string);
            $pipe->setBit($this->bucket, $hash, 1);
        }
        return $pipe->exec();
    }

    /**
     * 查询是否存在, 如果曾经写入过,必定回true,如果没写入过,有一定几率会误判为存在
     */
    public function exists($string)
    {
        $pipe = $this->Redis->multi();
        $len = strlen($string);
        foreach ($this->hashFunction as $function) {
            $hash = $this->Hash->$function($string, $len);
            $pipe = $pipe->getBit($this->bucket, $hash);
        }
        $res = $pipe->exec();
        foreach ($res as $bit) {
            if ($bit == 0) {
                return false;
            }
        }
        return true;
    }

}

上面定义的是一个抽象类,如果要使用,可以根据具体的业务来使用。比如下面是一个过滤重复内容的过滤器。

Mootion Mootion

Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。

Mootion 232 查看详情 Mootion
/**
 * 重复内容过滤器
 * 该布隆过滤器总位数为2^32位, 判断条数为2^30条. hash函数最优为3个.(能够容忍最多的hash函数个数)
 * 使用的三个hash函数为
 * BKDR, SDBM, JSHash
 *
 * 注意, 在存储的数据量到2^30条时候, 误判率会急剧增加, 因此需要定时判断过滤器中的位为1的的数量是否超过50%, 超过则需要清空.
 */
class FilteRepeatedComments extends BloomFilterRedis
{
    /**
     * 表示判断重复内容的过滤器
     * @var string
     */
    protected $bucket = 'rptc';

    protected $hashFunction = array('BKDRHash', 'SDBMHash', 'JSHash');
}

以上就是如何使用php+redis实现布隆过滤器的详细内容,更多请关注其它相关文章!


# 的是  # 沈阳营销推广招商公司  # 主题资源网站建设  # 天津营销推广常见方式  # 重庆网站模板推广  # 邯郸数据网站推广联系人  # 平度信息化网站优化特点  # 福建企业网站建设服务  # 微博营销推广规则最新版  # 新网站的推广计划书  # 抚州抖音seo排名多少  # PHP  # 贝尔  # 数为  # 可以根据  # 数据结构  # 是一个  # 即时通信  # 它是  # 如何处理  # 如何使用  # redis 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 如何外贸网站设计-能留住客户提升用户体验!  电脑从睡眠中被自动唤醒怎么办_Windows唤醒源事件查看与禁用【解决】  C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用  126手机126邮箱登录_126邮箱手机登录入口官网  告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度  电脑视频号|直播|如何分享屏幕  《磁力猫》最好用的磁官网  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  从HTML表单获取逗号分隔值并转换为NumPy数组进行预测  解决jQuery多计算器输入字段冲突的教程  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  Yandex浏览器官方入口_Yandex搜索引擎中文版  如何使用 composer 和 aop-php 实现 AOP 编程?  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  美发店速赢秘籍  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  圆通快递官网入口查询单号 手机版官方查询入口  C++如何实现单例模式_C++线程安全的单例模式写法  飞飞漫画漫画阅读官网_飞飞漫画漫画阅读官网进入阅读  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  4399正版网页版入口高清直达链接  优化Google Charts Gauge:在数据库无数据时显示默认值  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  歌词怎么展示在|直播|间视频号?有什么注意事项?  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  《sketchbook》选中部分图案移动方法  《盗墓笔记手游》技能介绍  顺丰官方查单号入口 顺丰快递单号查询官网入口  除了Copilot,还有哪些值得一试的VS Code AI插件?  excel怎么计算平均值 excel平均函数*ERAGE使用教学  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  苹果电脑如何快速查看电池状态 苹果电脑电池信息快捷方法  mysql中外键约束如何使用_mysql FOREIGN KEY操作  《杖剑传说》食谱大全  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  重返未来:1999卡戎全方位攻略  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  解决CSS容器溢出问题:使用calc()实现精确布局与边距控制  《单词速记宝》设置学习计划方法  Selenium自动化:利用键盘模拟解决复杂日期输入框输入问题  鲁班大师乓乓皮肤获取方法  解决Go encoding/json 将JSON大数字解析为浮点数的问题  微信如何设置字体大小_微信字体设置的阅读舒适  快手极速版在线体验区 快手极速版网页体验入口  无人机考证官网 中国民航无人机考证官网登录入口  iSpring三分屏制作教程  优化长HTML属性值:SonarQube警告与实用策略  解决Windows上Composer PATH变量冲突导致的命令无法识别问题  word文档中的分隔符有哪些不同类型和用途_Word分隔符类型与用途方法 

 2023-05-31

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.