5百万 uid 白名单 之 PHP Bit地图 处理
5百万 uid 白名单 之 PHP Bitmap 处理
近日,有同事说有个 5百万 的白名单处理, 到网上查找 相似案例, 说是有个bitmap的解法,
再次 google ,baidu 无相关 PHP 的解法, 于是自己写了一个:
?
<?php /* 5百万 uid 白名单 之 PHP Bitmap 处理 * author: hushuilong * email: hushuilong at gmail dot com * */ class Bitmap { private $handler = NULL; private $max = 0; public function __construct($file) { clearstatcache(true, $file); if(file_exists($file)) $this->handler = @fopen($file , 'r+') OR die('open bitmap file failed'); else $this->handler = @fopen($file , 'w+') OR die('open bitmap file failed'); $this->max = file_exists($file) ? (filesize($file) * 8 - 1) : 0; } public function __destruct() { @fclose($this->handler); } private function binary_dump($binary_data) { return sprintf('%08d',decbin(hexdec(bin2hex($binary_data)))); } private function num_check($num) { ($num > -1) OR die('number must be greater than -1'); ($num < 4294967296) or die('number must be less than 4294967296'); // 2^32 if ($this->max < $num) { fseek($this->handler, 0, SEEK_END); fwrite($this->handler , str_repeat("\x00",ceil(($num - $this->max)/8))); // fill with 0 $this->max = ceil($num/8)*8 - 1; } } public function set($num) { $this->num_check($num); fseek($this->handler, floor($num/8), SEEK_SET); $bin = fread($this->handler, 1) | pack('C',0x100 >> fmod($num,8)+1); // mark with 1 fseek($this->handler, ftell($this->handler)-1, SEEK_SET); // write a new byte fwrite($this->handler, $bin); fflush($this->handler); } public function del($num) { $this->num_check($num); fseek($this->handler, floor($num/8), SEEK_SET); $bin = fread($this->handler, 1) & ~pack('C',0x100 >> fmod($num,8)+1); // mark with 0 fseek($this->handler, ftell($this->handler)-1, SEEK_SET); // write a new byte fwrite($this->handler, $bin); fflush($this->handler); } public function find($num) { if (fseek($this->handler, floor($num/8), SEEK_SET) == -1) return FALSE; $bin = fread($this->handler , 1); if ($bin === FALSE || strlen($bin) == 0) return FALSE; $bin = $bin & pack('C',0x100 >> fmod($num,8)+1); if($bin === "\x00") return FALSE; return TRUE; } } $b = new Bitmap('/dev/shm/bitmapdata'); // 设置白名单 $b->set(1); $b->set(3); $b->set(5); $b->set(7); $b->set(9); $b->set(501); $uid = 501; var_dump($b->find($uid)); // 查找白名单 $b->del($uid); // 删除白名单 var_dump($b->find($uid)); // 查找白名单
?
其中 “$b = new Bitmap('/dev/shm/bitmapdata');”? 把文件,放在内存里,增加读写速度
执行结果如下:
hu@xunleiman-desktop:~/web/test/shm$ /bin/sh ./geany_run_script.sh
bool(true)
bool(false)
?
生成的bitmapdata文件 在附件里面:
?
?

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

想了解更多关于开源的内容,请访问:51CTO鸿蒙开发者社区https://ost.51cto.com运行环境DAYU200:4.0.10.16SDK:4.0.10.15IDE:4.0.600一、创建应用点击File->newFile->CreateProgect。选择模版:【OpenHarmony】EmptyAbility:填写项目名,shici,应用包名com.nut.shici,应用存储位置XXX(不要有中文,特殊字符,空格)。CompileSDK10,Model:Stage。Device

使用Java的File.length()函数获取文件的大小文件大小是在处理文件操作时很常见的一个需求,Java提供了一个很方便的方法来获取文件的大小,即使用File类的length()方法。本文将介绍如何使用该方法来获取文件的大小,并给出相应的代码示例。首先,我们需要创建一个File对象来表示我们想要获取大小的文件。以下是创建File对象的方法:Filef

php blob转file的方法:1、创建一个php示例文件;2、通过“function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })}”方法实现Blob转File即可。

使用Java的File.renameTo()函数重命名文件在Java编程中,我们经常需要对文件进行重命名的操作。Java提供了File类来处理文件操作,其中的renameTo()函数可以方便地重命名文件。本文将介绍如何使用Java的File.renameTo()函数来重命名文件,并提供相应的代码示例。File.renameTo()函数是File类的一个方法,

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

使用java的File.getParent()函数获取文件的父路径在Java编程中,我们经常需要操作文件和文件夹。有时候,我们需要获取一个文件的父路径,也就是该文件所在文件夹的路径。Java的File类提供了getParent()方法用于获取文件或文件夹的父路径。File类是Java对文件和文件夹的抽象表示,它提供了一系列操作文件和文件夹的方法。其中,get

使用java的File.getParentFile()函数获取文件的父目录在Java编程中,我们经常需要操作文件和文件夹。当我们需要获取文件的父目录时,可以使用Java提供的File.getParentFile()函数来完成。本文将介绍如何使用这个函数并提供代码示例。Java中的File类是用于操作文件和文件夹的主要类。它提供了许多方法来获取和操作文件的属性
