开发者(KaiFaX)

面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区

作者 | 道哥

来源 | 爱码有道

最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右,那么用完后会怎样呢?

今天,来聊一聊与腾讯QQ号码相关的三个问题,相信大家会有一个比较完整的认识。

  • QQ号的范围是多少?

  • QQ号用完后会怎样?

  • QQ号和bitmap渊源?

关于第一个问题,看完如下的有趣动图之后,肯定就会知道QQ号的最小值和最大值。

一. QQ号的范围是多少?

相信多数朋友都用过QQ,不过估计有些人很久没登录过了。你还记得自己的QQ号码吗?你知道QQ号码有多少位数吗?你知道QQ号码的大小范围吗?

别着急,我们会一一来解答。大家的微信号是字符串形式的,带有一些数字和字母,但QQ号是纯数字。在腾讯QQ后台的程序中,经常看到这样的代码:

unsigned int uin = getFromCookie(cookie, "uin") ;
if ( uin < 10001 )
{log.Error("invalid uin %u", uin) ;return INVALID_UIN ;
}

从这段简单的代码中,我们可以看出很多端倪。其中uin指代的就是QQ号码,有人说uin是unsigned int的缩写,有人说是user ID number的缩写。

不管怎样,uin表示的就是QQ号码,且是unsigned int类型,故QQ号就是4字节无符号整数,共32bit, 也就是说,QQ号的取值范围是:[0, 2^32 - 1]

然而,这只是理论情况,从上面代码的判断可知,QQ号码的最小值是10001, 为什么腾讯要做这种限制呢?其实没有为什么,仅仅是早期的一个设定而已。

对于QQ号码而言,从10001开始,号越小,就大致表明申请时间越早,是一个尊贵号。那么,10001是谁的QQ号呢?很容易猜,不过他实际不用这个号。

2^32 - 1 的值是4294967295, 是一个10位的整数,大约是43亿,这就是QQ号码的理论最大值,你肯定没有见过11位的QQ号,至少目前是不可能存在的。

到目前为止,大家肯定就能理解下图中的数字含义了。在后续面试腾讯时,如果再问到QQ号码相关的问题,一定要意识到QQ号码的大小范围,会有帮助的。

二. QQ号用完后会怎样?

既然QQ号码的值是有范围的,那么自然有疑问:如果这么多QQ号码都被申请完后,结果会怎样呢?这是一个有趣的问题,但别替腾讯担心这些根本问题。

对于很多互联网公司而言,账号体系就是生命线,对腾讯尤其如此。最近几年,微信的势头超过QQ, QQ的月活远低于10亿,注册了的QQ也远小于43亿个。

所以,完全不用担心QQ号会超过43亿,在相当长的一段时间内,43亿是达不到的。而且,腾讯现在做了各种限制,并不会允许一个人无限地注册QQ号码。

另外,如果一个QQ号被注册了,但长期不登录,那么就相当于占着茅坑不拉屎,浪费资源。此时,腾讯也会考虑对QQ号进行回收,具体的逻辑就不说了。

然而,凡事总有万一,如果有一天QQ号码突破了43亿,那也可以,对腾讯来说,意味着业务蓬勃发展,也是好事。那么,QQ后台很多代码就需要重构了。

三. QQ号和bitmap渊源

在腾讯的面试题中,经常以QQ号码为背景进行考察。比如典型题目:文件中有40亿个QQ号码,如何进行去重?

如果没有敏感意识到使用bitmap,就是很糟糕很不应该的事情,说明基本没有好好去准备啊。bitmap图解如下:

unsigned char共8位,取值范围是[0, 255],这个unsigned char的数值是255,能标识0~7这些数字都存在。

同理,如下这个unsigned char类型的值是254,它对应的含义是:1~7这些数字是存在的,而数字0是不存的:

由此可见,一个unsigned char类型的数据,可以标识0~7这8个整数的存在与否,这是很好理解的,以此类推:

  • 一个unsigned int类型数据可以标识0~31这32个整数的存在与否。

  • 两个unsigned int类型数据可以标识0~63这64个整数的存在与否。

说白了,也就是4B的内存,可以标识32个整数的存在与否。如果还不清楚的话,我来画个表格,逐步推演一下:

内存大小 标识数的范围
4B 0~31
8B 0~63
16B 0~127
... ...
512MB 0~2^32 - 1

由此可见,512MB的内存大小,刚好可以用来标识所有的QQ号码的存在与否,一切迎刃而解。

下面,我们看一下bitmap的程序,很好懂,也很实用,轻轻松松地实现了标记功能,顺便去重。

#include <iostream>
#include <set>
#include <cstring>
using namespace std;#define N 20  // 考究0~19这20个数字
#define SHIFT 5
#define MASK 0x1f
unsigned int a[1 + N / 32] = {0}; // 设置第i位为1, 让它处于点亮状态
void setOne(int i)
{a[i >> SHIFT] |= (1 << (i & MASK));
}// 设置第i位为0, 让它处于熄灭状态
void setZero(int i)
{a[i >> SHIFT] &= ~(1 << (i & MASK));
}// 获取第i位的状态
int getState(int i)
{return (a[i >> SHIFT] & (1 << (i & MASK))) && 1;
}int main(void)
{// 把1,3,1,4,9,9,9这几个值的状态点亮,即状态为1setOne(1); setOne(3);setOne(1);setOne(4);setOne(9);setOne(9);setOne(9);int i = 0;for(i = 0; i < N; i++){cout << i << "对应的状态为:--->" << getState(i) << endl; // 获取状态}cout << endl;return 0;
}

编译运行一下,结果为:

0对应的状态为:--->0
1对应的状态为:--->1
2对应的状态为:--->0
3对应的状态为:--->1
4对应的状态为:--->1
5对应的状态为:--->0
6对应的状态为:--->0
7对应的状态为:--->0
8对应的状态为:--->0
9对应的状态为:--->1
10对应的状态为:--->0
11对应的状态为:--->0
12对应的状态为:--->0
13对应的状态为:--->0
14对应的状态为:--->0
15对应的状态为:--->0
16对应的状态为:--->0
17对应的状态为:--->0
18对应的状态为:--->0
19对应的状态为:--->0

QQ号码和bitmap的渊源就是如此,以后在面试时,不可忽视bitmap的妙用哦,也希望大家看完这篇文章后,有所收货,心情愉快。最后,来画一张动图玩玩,希望大家喜欢。


1. 回复“m”可以查看历史记录;

2. 回复“h”或者“帮助”,查看帮助;

开发者已开通多个技术群交流学习,请加若飞微信:1321113940  (暗号k)进开发群学习交流

说明:我们都是开发者。视频或文章来源于网络,如涉及版权或有误,请您与若飞(1321113940)联系,将在第一时间删除或者修改,谢谢!

开发者:KaiFaX

面向全栈工程师的开发者
专注于前端、Java/Python/Go/PHP的技术社区

腾讯43亿QQ号码用完后怎么办?相关推荐

  1. 腾讯二面:43 亿 QQ 号码用完后怎么办?

    最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右,那么用完后会怎样呢? 今天,来聊一聊与腾讯QQ号码相关的三个问题,相信大家会有一个比较完整的认识. QQ号的范围是多少? QQ号用完后会怎样? ...

  2. 利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?

    ​参考: 腾讯43亿QQ号码用完后怎么办? 腾讯三面:40亿个QQ号码如何去重 一.背景: 首先,明确两点: QQ号是 unsigned int 类型(4字节无符号整数,共32bit), 也就是说 Q ...

  3. 腾讯三面:40亿个QQ号码如何去重?

    我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思.具体的题目如下: 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该很清楚 ...

  4. 腾讯三面:40 亿个 QQ 号码如何去重?

    今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思.具体的题目如下: 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 这个题目的意思应该 ...

  5. 851-40亿个号码如何去重?

    40亿个QQ号码如何去重? 文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G. 在原题中,实际有40亿个QQ号码,为了方便起见,在图解和叙述时,仅以4个QQ为 ...

  6. 腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?

    说在前面 在40岁老架构师 尼恩的读者社区(50+)中,最近有小伙伴拿到了一线互联网企业如腾讯.美团.阿里.拼多多.极兔.有赞.希音的面试资格,遇到一几个很重要的面试题: 40亿Q号如何设计算法去重, ...

  7. 诺亚财富通过聆讯:年营收43亿 汪静波有49%投票权,红杉是股东

    雷递网 雷建平 6月22日报道 诺亚控股私人财富资产管理有限公司(简称:"诺亚财富")日前通过聆讯,准备在香港上市. 一旦在香港上市,诺亚财富也将成为近期又一回归香港上市的中概股. ...

  8. 新浪微博,腾讯微博,QQ号码 联合登录。。。完善中...

    新浪微博 技术接口地址:http://open.t.sina.com.cn/wiki/SDK 腾讯微博 技术接口地址:http://open.t.qq.com/open-js/doc/ QQ号码登录 ...

  9. 【产业互联网周报】BAT加速布局智慧城市:百度14.43亿元投资东软控股、腾讯签约武汉、阿里签约杭州...

    关注ITValue,看企业级最新鲜.最具价值报道! 图片来源@视觉中国 | [产业互联网周报 是由钛媒体TMTpost发布的特色产品,将整合本周最重要的企业级服务.云计算.大数据领域的前沿趋势.重磅政 ...

最新文章

  1. 下标索引必须为正整数类型或逻辑类型_Python3 基本数据类型
  2. 结对开发——求最大值
  3. Etherchannel 备忘
  4. [书摘]架构真经--可扩展性规则的利益与优先级排行榜
  5. 【元胞自动机】基于元胞自动机实现单边教室人群疏散含Matlab源码
  6. centOS安装openoffice4.1.6 并解决字体乱码
  7. 什么是深拷贝与浅拷贝
  8. Linux学习16 软件包和启动项管理
  9. 输入两个正整数num1、num2,计算并输出它们的和、差、积、整数商和余数
  10. Django企业开发实战--by胡阳,学习记录1015
  11. 微信小程序:用wxs进行过滤处理
  12. 商会管理系统_沈阳写字间丨商会总部大厦
  13. PreScan快速入门到精通第三十四讲基于PreScan进行超声波雷达传感器仿真
  14. 使用filebeat和logstash解析java的log4j日志
  15. Django自研告警平台-让告警排好队
  16. s14.一键安装haproxy脚本
  17. /wp-cron.php_通过CRON / PHP快速检测被黑客入侵的文件:SuperScan
  18. 论坛头像编辑 html,spu头像编辑.html
  19. html 反向链接,什么是反链接,外链和反链的区别介绍
  20. Leetcode快速入门之第三节课: 分治算法

热门文章

  1. 微积分基本定理:微分符号与积分符号是逆运算
  2. Python的内置模块
  3. 图像识别VPU——易用的嵌入式AI支持深度学习平台介绍
  4. 如何让谷歌浏览器支持迅雷下载
  5. 洛谷P4094 - [TJOI2016]字符串
  6. 网页字体转换——实习僧
  7. Git命令的使用(进阶版)
  8. 微信的根服务器在哪国,为何很多人把微信上的国家设置成安道尔?安道尔在哪里?...
  9. 【基础】python操作Word时,自动更新目录(二)
  10. CPU位数、操作系统位数和编译器位数关系