基于bitset实现手机号的黑白名单方案

原创 2016年08月30日 17:24:32

目前很多app都把手机号码作为登录的账户名,本文介绍一种高效的基于手机号,来实现黑白名单的方案。

在这里我先用一个例子来说明位图。

      假设我有一个0到31的集合,集合里面的元素不重复,比如这样{0,3,1,5,2,19,7,8,31,21,10}。通过位图,我可以将这样的集合表示为11110001101000000001010000000001, 其中1表示该数值为下标的数存在在集合中,比如第一个1表示0存在集合中,第二个1表示1存在集合中,等等。通过这样做,我们起码可以得到两个好处

      1) 节省空间--我们可以用二进制一个位来存储存储两个信息,一是存不存在,而是存在的数是多少(通过一个bit就可以得到这么多信息,真了不起)。

      2) 排序--从左到右遍历这个为图,我们可以得到排序的集合,比如上例中,我们可以得到集合 {0,1,2,3,7,8,10,19,21,31}

      如果将所有这电话号码用位图表示,那么需要9999999999个bit (10个9, 考虑到手机号码的第一位都是1)。 9999999999 bit = (9999999999/8) byte = (9999999999 / (8 * 1024)) KB = (9999999999 / 8 *1024*1024) M = 1192M

      嗯....,1192M,内存占有还是太大,我们前期的黑白名单所占内存远远低于这个值。 考虑到手机号码的前3位都差不多,而且总数最多30个,所以考虑到手机号码拆分为两部分(头3位和剩余8位),这样就把位图的位数就降2个数量级了。所以如果我们要在内存中装入手机号码后8位,需要99999999(8个9)个bit,算一下

      99999999 bit = (99999999/8) byte = (99999999 / (8 * 1024)) KB = (99999999 / 8 *1024*1024) M = 11.92M 

内存中装入头2位(手机号第一位始终为1,因此只需装入后面2位),需要99(2个9)个bit,算下 
99 bit = 99/8 byte =12.375 byte。 

大约12M 内存,就能表示所有手机号码,达到黑白名单。 这个比用redis等缓存,高效很多,java里面的bitset也是这个原理。

Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案

这是一个execl文件导入数据库操作,使用jxl解析execl导入数据库过程出现了科学计数法,与想要导入的数据不匹配,以下是案例以及解决方案:导入成功后示例: 1、手机号:15388886666 科...

jmeter实现手机号归属地接口测试案例

通过jmeter进行手机号归属地接口测试。

Android使用mob实现手机号验证注册

现在很多的app都采用首次进入使用手机号码快速注册成功,然后登入设置各种用户信息。这里使用mob第三方sdk实现手机号码的快速注册,实现起来也很简单,集成文档也有说明,这里把实现的过程和结果都记录下来...
  • linxi7
  • linxi7
  • 2016年09月23日 11:34
  • 3558

Android:实现手机号归属地查找的应用

原理:通过HTTP协议发送XML数据并调用webservice(soap)   首先定义string.xml   view plaincopy to clipboardprint?...

Android实现输入手机号时自动添加空格

Android实现输入手机号时自动添加空格

jQuery第4节-链接api实现星座运势和手机号归属地查询

连接api  做一个星座运势查询。 星座运势查询-api 星座名称: --> 请选择 白羊座 金牛座 双子座 巨蟹座 ...

iOS开发笔记:实现对手机号、邮箱输入格式的判断(正则表达式)

废话: 现在APP的登录注册基本上已经离不开手机和邮箱绑定。今天在遇到了对输入的文本进行邮箱格式判断这个问题,所以google了一下,发现一个叫正则表达式的东西(应该大学学过,但是毫无印象)。 学...

实现网页中的搜索输入框效果 onfocuse onblur js 验证手机号 座机区号

前端页面输入框,实现输入框内文本提示
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于bitset实现手机号的黑白名单方案
举报原因:
原因补充:

(最多只允许输入30个字)