Maison développement back-end tutoriel php 5百万 uid 白名单 之 PHP Bit地图 处理

5百万 uid 白名单 之 PHP Bit地图 处理

Jun 13, 2016 am 11:01 AM
file gt handler this

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)); // 查找白名单
Copier après la connexion

?

其中 “$b = new Bitmap('/dev/shm/bitmapdata');”? 把文件,放在内存里,增加读写速度

执行结果如下:

[email protected]:~/web/test/shm$ /bin/sh ./geany_run_script.sh
bool(true)
bool(false)

?

生成的bitmapdata文件 在附件里面:


?

?

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Tags d'article chaud

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quelles sont les différences entre Huawei GT3 Pro et GT4 ? Quelles sont les différences entre Huawei GT3 Pro et GT4 ? Dec 29, 2023 pm 02:27 PM

Quelles sont les différences entre Huawei GT3 Pro et GT4 ?

Poésie aléatoire d'application native Hongmeng Poésie aléatoire d'application native Hongmeng Feb 19, 2024 pm 01:36 PM

Poésie aléatoire d'application native Hongmeng

Utilisez la fonction File.length() de Java pour obtenir la taille du fichier Utilisez la fonction File.length() de Java pour obtenir la taille du fichier Jul 24, 2023 am 08:36 AM

Utilisez la fonction File.length() de Java pour obtenir la taille du fichier

Comment convertir un blob php en fichier Comment convertir un blob php en fichier Mar 16, 2023 am 10:47 AM

Comment convertir un blob php en fichier

Correctif : l'outil de capture ne fonctionne pas sous Windows 11 Correctif : l'outil de capture ne fonctionne pas sous Windows 11 Aug 24, 2023 am 09:48 AM

Correctif : l'outil de capture ne fonctionne pas sous Windows 11

Renommez les fichiers à l'aide de la fonction File.renameTo() de Java Renommez les fichiers à l'aide de la fonction File.renameTo() de Java Jul 25, 2023 pm 03:45 PM

Renommez les fichiers à l'aide de la fonction File.renameTo() de Java

Utilisez la fonction File.getParentFile() de Java pour obtenir le répertoire parent du fichier Utilisez la fonction File.getParentFile() de Java pour obtenir le répertoire parent du fichier Jul 27, 2023 am 11:45 AM

Utilisez la fonction File.getParentFile() de Java pour obtenir le répertoire parent du fichier

Comment réparer l'erreur Impossible de se connecter à l'App Store sur iPhone Comment réparer l'erreur Impossible de se connecter à l'App Store sur iPhone Jul 29, 2023 am 08:22 AM

Comment réparer l'erreur Impossible de se connecter à l'App Store sur iPhone

See all articles