腾讯 43 亿 QQ 号码用完后怎么办?
共 942字,需浏览 2分钟
·
2021-12-16 19:33
大家好,我是道哥。
最近有读者提问:听说腾讯QQ号码的理论最大值是43亿左右,那么用完后会怎样呢?
今天,来聊一聊与腾讯QQ号码相关的三个问题,相信大家会有一个比较完整的认识。
QQ号的范围是多少?
QQ号用完后会怎样?
QQ号和bitmap渊源?
一. 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号码,且是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号码,如何进行去重?
unsigned char共8位,取值范围是[0, 255],这个unsigned char的数值是255,能标识0~7这些数字都存在。
同理,如下这个unsigned char类型的值是254,它对应的含义是:1~7这些数字是存在的,而数字0是不存的:
一个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 |
using namespace std;
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这几个值的状态点亮,即状态为1
setOne(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的妙用哦,也希望大家看完这篇文章后,有所收货,心情愉快。最后,来画一张动图玩玩,希望大家喜欢。
欢迎加入技术交流群