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心電圖和血管及安

使用Java的File.length()函數取得檔案的大小檔案大小是在處理檔案作業時很常見的一個需求,Java提供了一個很方便的方法來取得檔案的大小,即使用File類別的length()方法。本文將介紹如何使用此方法來取得檔案的大小,並給出對應的程式碼範例。首先,我們需要建立一個File物件來表示我們想要取得大小的檔案。以下是建立File物件的方法:Filef

想了解更多關於開源的內容,請造訪: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

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類別是用於操作檔案和資料夾的主要類別。它提供了許多方法來取得和操作文件的屬性
