`

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文件 在附件里面:


 

 

  • 大小: 112.7 KB
分享到:
评论

相关推荐

    把bitmap处理成圆角

    在Android开发中,为了提升用户体验,我们经常需要对图片进行特殊处理,比如将矩形的Bitmap转换为圆角效果。这种需求在用户头像显示、卡片设计等场景中尤为常见。"把bitmap处理成圆角"是Android UI设计中一个重要的...

    处理bitmap内存溢出问题

    在Android开发中,处理`Bitmap`内存溢出问题是一个常见的挑战,尤其是在处理高分辨率或大尺寸图片时。当应用程序尝试加载或操作一张超出虚拟机内存预算的`Bitmap`时,系统会抛出`java.lang.OutOfMemoryError: bitmap...

    Android Bitmap 处理示例

    在Android开发中,Bitmap是用于表示图像数据的核心类,它在UI显示和图像处理中扮演着重要角色。然而,由于Bitmap对象通常占用大量的内存,不当的处理可能导致内存溢出(Out Of Memory)问题,因此对Bitmap进行高效...

    bitmap 处理

    Bitmap处理在IT行业中,特别是在移动应用开发,尤其是Android平台,是一项关键技能。Bitmap是Android系统中用于存储像素数据的数据结构,常用来显示图像。这里,我们深入探讨Bitmap处理的知识点。 1. **Bitmap基本...

    android Bitmap特效处理

    在Android开发中,Bitmap是用于表示图像数据的基本类,它在UI设计和图像处理中扮演着重要角色。本文将深入探讨如何使用Bitmap实现各种特效处理,包括黑白特效、底片特效、浮雕特效、模糊特效、锐化特效以及怀旧特效...

    Android-使用Matrix对Bitmap进行处理

    在Android开发中,Bitmap是用于图像处理的基本对象,它存储并表示了图像的数据。而Matrix则是Android图形系统中的一个关键类,它允许我们对图像进行各种变换操作,如旋转、缩放、平移和倾斜等。这个教程将深入探讨...

    处理android bitmap oom

    在Android开发中,Bitmap对象是用于处理图像的主要类,但如果不妥善管理,它可能会引发“Out Of Memory”(OOM)错误。这是因为Android设备的内存有限,尤其是对于大型图像,加载到内存中会消耗大量资源。当应用无法...

    android中对Bitmap图片设置任意角为圆角

    5. 最后,使用Canvas的drawBitmap方法,传入旋转后的Bitmap和旋转中心点,将其绘制到圆形Bitmap上。 这个过程中,关键在于正确地设置BitmapShader和PorterDuff.Mode,以及合理地使用Matrix进行旋转操作。如果要处理...

    bitmap上传图片demo

    在Android开发中,Bitmap是处理图像数据的基本类,它用于表示位图图像。"bitmap上传图片demo"是一个示例项目,展示了如何利用Bitmap处理本地图片并进行上传,同时提供了将图片裁剪为圆形以适合作为头像的功能。在这...

    bitmap图片处理工具类

    "Bitmap图片处理工具类" 提供了多种对位图(Bitmap)进行操作的功能,如颜色转换、图像分割、缩放、旋转、调整透明度、生成圆角图片以及文字与倒影效果的绘制。接下来,我们将深入探讨这些知识点。 首先,`...

    Bitmap图像转halcon图像

    在进行机器视觉项目时,有时我们需要将Bitmap图像转换为Halcon能识别的图像类型,即HObject,以便在Halcon中进行后续的图像分析和处理。下面我们将详细讲解如何实现这个转换过程,并探讨相关的IT知识点。 首先,让...

    BitmapFun.zip Android Bitmap 处理

    在Android开发中,Bitmap是用于表示图像数据的基本类,它在UI设计和图像处理中扮演着核心角色。BitmapFun.zip包含了一系列关于Android Bitmap处理的例子,主要聚焦于如何有效地管理大图片以及实现图片缓存机制。这里...

    c#.net Bitmap类的基本使用方法

    在C#.NET编程环境中,`Bitmap`类是用于处理图像的核心类,它允许开发者创建、加载、修改和显示位图图像。本篇文章将详细介绍`Bitmap`类的基本使用方法,包括其构造函数、属性、方法以及如何与其他图形组件交互。 1....

    Android应用源码之(Bitmap位图渲染与操作).zip

    在Android应用开发中,Bitmap是用于处理图像的基本类,它代表了一个位图图像。位图渲染与操作是Android图形处理的重要部分,对于优化性能、创建动态效果和自定义UI至关重要。以下将详细讨论Bitmap的使用、渲染过程...

    bitmap数据结构复制

    5. **效率优化**:在处理大型Bitmap时,为了提高效率,可以使用多线程或者异步处理来分块复制,减少一次性拷贝大量数据带来的性能开销。 在实际编程中,可以使用各种编程语言来操作Bitmap,如C++、C#、Java等,都有...

    对Bitmap图进行模糊处理

    用于制作模糊的图片,多用于背景模糊效果,bitmap Bitmap 需要模糊的图像,context Context 上下文对象

    Android下利用Bitmap切割图片

    在Android开发中,Bitmap是处理图像的基本类,用于在内存中表示位图图像。当我们需要对图片进行裁剪、缩放或进行其他操作时,Bitmap提供了丰富的功能。本篇文章将详细探讨如何在Android环境下利用Bitmap来切割图片。...

    Bitmap位图旋转范例

    Bitmap位图是Android系统中广泛使用的...总之,“Bitmap位图旋转范例”是一个很好的学习资源,通过研究这个工程,开发者可以掌握如何在Android中有效地处理Bitmap的旋转,同时了解与之相关的内存管理和性能优化技巧。

    c#Bitmap类和Graphics类

    C#中的Bitmap类和Graphics类是两种常用的图形处理类,它们之间存在一定的差异和联系。在本节中,我们将详细介绍Bitmap类和Graphics类的概念、方法和应用场景。 一、Bitmap类 Bitmap类是C#中用于图像处理的基本类,...

    Activity跳转时传递Bitmap对象

    在Android开发中,Activity之间的数据传递是常见的操作,特别是在处理图像数据时,如Bitmap对象。Bitmap是Android系统中用于表示图像的重要类,它包含了图像的所有像素信息。在不同Activity之间传递Bitmap,通常是...

Global site tag (gtag.js) - Google Analytics