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');”? 把文件,放在内存里,增加读写速度
执行结果如下:
[email protected]:~/web/test/shm$ /bin/sh ./geany_run_script.sh
bool(true)
bool(false)
?
生成的bitmapdata文件 在附件里面:
?
?

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

オープン ソースの詳細については、次のサイトを参照してください。 51CTO Honmeng 開発者コミュニティ https://ost.51cto.com 実行環境 DAYU200:4.0.10.16SDK: 4.0.10.15IDE: 4.0.600 1. アプリケーションを作成するには、[ファイル] をクリックします。 >新しいファイル ->プロジェクトの作成。テンプレートを選択します: [OpenHarmony] EmptyAbility: プロジェクト名 shici、アプリケーション パッケージ名 com.nut.shici、およびアプリケーションの保存場所 XXX (中国語、特殊文字、スペースは含まれません) を入力します。 CompileSDK10、モデル: ステージ。デバイス

ファイルのサイズを取得するには、Java の File.length() 関数を使用します。ファイル操作を扱うとき、ファイル サイズは非常に一般的な要件です。Java では、ファイルのサイズを取得するための非常に便利な方法、つまり length( ) File クラスのメソッド。この記事では、このメソッドを使用してファイルのサイズを取得する方法と、対応するコード例を紹介します。まず、サイズを取得したいファイルを表す File オブジェクトを作成する必要があります。 File オブジェクトを作成する方法は次のとおりです: Filef

PHP BLOB をファイルに変換する方法: 1. PHP サンプル ファイルを作成します; 2. 「function blobToFile(blob) {return new File([blob], 'screenshot.png', { type: 'image/jpeg' })」を通じて} 」メソッドを使用して、Blob をファイルに変換できます。

Java の File.renameTo() 関数を使用してファイルの名前を変更する Java プログラミングでは、ファイルの名前を変更する必要がよくあります。 Java には、ファイル操作を処理するための File クラスが用意されており、その renameTo() 関数でファイルの名前を簡単に変更できます。この記事では、Java の File.renameTo() 関数を使用してファイルの名前を変更する方法と、対応するコード例を紹介します。 File.renameTo() 関数は、File クラスのメソッドです。

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

ファイルの親パスを取得するには、Java の File.getParent() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。場合によっては、ファイルの親パス、つまりファイルが存在するフォルダーのパスを取得する必要があることがあります。 Java の File クラスには、ファイルまたはフォルダーの親パスを取得する getParent() メソッドが用意されています。 File クラスは、ファイルとフォルダーを Java で抽象表現したもので、ファイルとフォルダーを操作するための一連のメソッドを提供します。その中で、手に入れてください

ファイルの親ディレクトリを取得するには、Java の File.getParentFile() 関数を使用します Java プログラミングでは、ファイルやフォルダーを操作する必要がよくあります。ファイルの親ディレクトリを取得する必要がある場合は、Java が提供する File.getParentFile() 関数を使用できます。この記事では、この関数の使用方法とコード例を説明します。 Java の File クラスは、ファイルやフォルダーを操作するために使用される主なクラスです。ファイルのプロパティを取得および操作するための多くのメソッドを提供します
