近日,有同事说有个 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文件 在附件里面:
- 大小: 112.7 KB
分享到:
相关推荐
处理bitmap内存溢出问题
很多项目中用到了用户头像,但是系统的ImageView 是四方形的 ,自己写了个处理的方法, 把bitmap处理成圆角的
bitmap 处理
代码是关于bitmap图形特效处理的。有黑白特效、底片特效、浮雕特效、模糊特效、锐化特效、怀旧特效。
基于Javascript的bitmap处理,并且将位图输出为base64编码以便于浏览器进行显示。 一、Bitmap.create(width, height, bgcolor) 创建一个width x height像素大小的位图,底色为bgcolor所代表的颜色。 如:bitmap....
这个 Demo 给出了 Android 上处理图片的通用方法,包括图片缓存,加载大图片的方法等。
Android-使用Matrix对Bitmap进行处理
在Android编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。这些效果在Android中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换...
BitmapFun.zip Android Bitmap ,处理大图片、图片缓存
android中对Bitmap图片设置任意角为圆角
android图片处理(压缩,保存,截屏,view转化为bitmap)相关函数 ImageUtils
安卓在加载大图的时候经常会出现oom的错误,给大家分享我的一些处理经验。 这个是优化后的版本。
软件开发网在此之前给大家介绍过图片加载框架Glide的基本用法介绍,大家可以先参考一下,本篇内容更加深入的分析了Glide获取图片Path、Bitmap用法,以及实现的代码分析。 1. 获取Bitmap: 1)在图片下载缓存好之后...
android bitmap outofMemory 用来解决android中常见的bitmap outOfMemory
Bitmap 转 txt 源码
Halcon_Bitmap转换方法 写的文档 开发笔记
用于制作模糊的图片,多用于背景模糊效果,bitmap Bitmap 需要模糊的图像,context Context 上下文对象
机器视觉技术必备,从位图到halcon图像,bitmap图像转为halcon图像,bitmap to Hobject
bitmapFont.zip
本文实例讲述了Android开发实现去除bitmap无用白色边框的方法。分享给大家供大家参考,具体如下: 图示 如下图所示,之前介绍过Android Bitmap的用法,这里提供的工具类作用是,去除内容区域以外的白色边框。 代码 ...