今天的整点儿新闻主要是想让大家学点东西用来泡妹子。想看段子和吐槽的现在可以退出了!我们明天整点儿新闻再见~!
留下来的朋友们,小手放在膝盖上准备听讲。
PSY 的《江南 Style》MV 这两天在 YouTube 上的点击量超过了 2,147,483,647,逼着谷歌升级了计数服务——
谷歌说我们从来没有想到有个视频的观看量会超过 2,147,483,647,直到 PSY 的《江南 Style》出现……
为什么超过这个看起来毫无规律的数会让 YouTube 的计数器出现问题呢?这个数字到底有什么神秘力量?是亲情?是仇恨?下面请收看特别节目《走进大计基》。
(以下科普来自知乎日报后端工程师老孙,有任何错误请指出,我们会把老孙赶回花果山。)
我们在页面上看到一个数字——1。
在服务器上这个 1 可不是 1 了,而是 1。
页面上一个看到一个数字——2。
在服务器可不是 2,也不是 2,而是 10。
如果是 30 呢?服务器上会存着 11110。
是的,电脑是很笨的,它只认识 0 或者 1。这样很 2,所以又叫二进制。
这些数据存在哪呢?存在一个计数器里,就像这样——
这是一个有四个位置的计数器,管它叫四位计数器。
假如它是二进制的,那么能显示的数值范围就是 0000-1111,转换成 10 进制就是 0-15(0 到 2 的 4 次方减 1)。
那我想记录 16 怎么办?不能够,这个不能够的学名叫冒漾(数据溢出)。
我们需要换一个更多位的计数器。
电脑上的计数器的大小一般是字节(Byte)的倍数,一个字节有 8 位(8 bits,每一 bit 只能显示 0 或者 1)。
我们取一个字节来给我们计数,所以我们就拥有了一个八位计数器,终于能记录 16 了!16 在这个计数器上会显示为——
00010000
这个计数器最多能记录到哪呢?11111111,10 进制为 2 的 8 次方减去 1 = 255,超过这个数也会冒漾。
好吧,看来我们只好再用 2 字节来做计数器,就是 16 位。能记录到 1111111111111111(二进制)= 65,535(十进制)。
十六位计数器可以记录这么大的数字,大家都很开心,攻城师觉得十六位计数器是好的。
不过有个问题,负数怎么记录?没有负号哇。
有一个聪明的攻城师说了,没关系,那我们就用最高位来表示正负,最高位是 1 这个数就是负的,最高位是 0 这个数就是正的。
01111111 再加 1 就是 10000000,为了便于计算,攻城师把这值定义为最小值,也就是 -128。
于是这个带正负的 1 字节八位计数器能记录的值为 -128 到 127。能记录的最大数变小了,但我们能记录负数啦,攻城师又开心了,
「我们再做一个 4 字节的计数器吧!」「好啊好啊好啊好啊……」
4 字节是 32 位,能记录的最大值是——
01111111111111111111111111111111
换算成 10 进制是多少?
2,147,483,647……
攻城师看见这个数字愣了,脑海中浮现出这样一张脸——
是的,鸟叔的《江南 Style》MV 观看量超过的就是这么一个数字。
所以聪明的你现在应该知道了,YouTube 给视频做计数的计数器是一个带正负的 4 字节三十二位计数器。
被鸟叔爆掉了。
回到谷歌这个声明,现在你看到他们说「我们从没想到有人能超过 2,147,483,647」就明白他们在说什么了吧?他们本来以为这个有符号的 4 字节三十二位计数器够用了。
也是,估计 YouTube 当年在刚开始创建网站的时候,不可能想到自己站上会有个视频被播放了二十几亿次吧,所以可能对计数器最大值这个东西也没当回事。
举个例子,优酷热播视频《小苹果》的播放数也只有 1968 万次。
而这已经是相当不错的成绩了。
谷歌修复这个问题的手段也很粗暴,他们直接把这个计数器升级成了带正负的 8 字节六十四位计数器,最大计数到 9,223,372,036,854,775,808。来,鸟叔,你再试试。
不过谷歌在修复这个问题的时候除了粗暴,也玩了一点情怀。
先说下,鸟叔超过了这个数字会发生什么呢?
计数器的第一位会变成 1——
10000000000000000000000000000000(二进制)= -2,147,483,648(十进制),然后这个数字会继续变大。
谷歌保留了这个错误结果,并且提醒大家可以把鼠标放在已经修复好的数字上面,「看一个数学小魔术(a little math magic)」
所以现在,鼠标没放在数字上面的时候,这个数字会显示视频的实际播放结果——
鼠标放在上面——
谷歌会显示一个错误的结果。
恩是的你可以给妹子展示这个小魔术,并且告诉她这背后的原理。
其实计算机界有很多问题都是由这个看起来很好解决的「冒漾问题」引起的。
比如有很多软件用来记录时间的计数器也是带正负的 4 字节 32 位计数器,只能记录从 1970 年 1 月 1 日之后的 2,147,483,647 秒,也就是到 2038 年 1 月 19 日凌晨 03:14:07。
然后这个数值会跳到最小的负数,然后计算机就疯了。
你看,你又有一样新的知识可以拿去泡妹子了。
「你知道 2038 年 1 月 19 日凌晨 03:14:07 是世界末日吗?」
不过不用害怕这些,因为攻城师是不会让这种事情发生的,他们已经无数次拯救地球了。比如之前的 IPv4 互联网协议,是给各位分配 IP 地址的。前一阵大家发现 IP 地址不够用了,于是攻城师说大家开始遵循新的 IPv6 服务吧,问题就解决了。
这些问题大部分出现的原因是什么呢?其实和 YouTube 刚开始建立的时候的想法一样——没当回事,「谁能知道我做这个东西居然会这么多人用、活这么久啊!」
这就不得不提知乎日报的前瞻性了!敝报从上线第一天,就用的是六十四位计数器!性能刚刚的!
不信你点一下这篇的赞试试,超过 21 亿个赞也不会坏掉。