我想以Youtube为例:他们使用ID的形式PEckzwggd78
。
他们为什么不使用简单的整数?
或imgur.com-他们还使用ID,例如9b6tMZS
图像和画廊。不是连续的整数。
他们为什么不使用整数(尤其是顺序整数)?
在什么情况下使用这样的字符串ID而不是整数是明智的决定?
我想以Youtube为例:他们使用ID的形式PEckzwggd78
。
他们为什么不使用简单的整数?
或imgur.com-他们还使用ID,例如9b6tMZS
图像和画廊。不是连续的整数。
他们为什么不使用整数(尤其是顺序整数)?
在什么情况下使用这样的字符串ID而不是整数是明智的决定?
Answers:
由于以下两个原因,Youtube无法使用顺序ID:
几乎可以肯定其数据库是分布式的,这使得顺序编号变得复杂。
它具有一个隐私选项“不公开的视频”:那些不会显示在搜索结果中的视频,但是如果您知道ID,则可以使用。
因此,视频ID应该合理地随机且不可预测。ID是仅由数字表示还是由字母和数字的组合表示都是无关紧要的:从一种表示形式到另一种表示形式的映射很简单。
2^40
项目,则在某些体系结构中,有合理的理由选择空格2^80
或2^120
位。原因示例包括:在没有技术检查碰撞的情况下减少碰撞;使用密钥的稀疏性来使秘密难以发现(“未公开的视频”)等
在ID的形式:他们使用的Base64(使用字符a
- z
,A
- Z
,0
- 9
,-
和_
)。这使他们每个字符有6位信息。YouTube使用11个字符的视频ID,这意味着它们可以生成2个6 * 11或超过7 * 10 19个 ID。正如汤姆·斯科特(Tom Scott)所说,“在地球上,每个人都可以在大约18,000年的时间里每分钟上传视频。Base64也很容易使用,因为64是2的幂,这意味着每个字符都代表确切的位数。出于相同的原因,我们使用十六进制(以16为底)。
关于ID的非顺序性质:这意味着它们在为视频分配ID的所有服务器之间不需要同步计数器。他们可以生成一个随机数,检查它是否已被使用,然后从那里去。他们甚至可以为每个服务器分配一个ID块以进行选择,并消除重复检查。我不知道他们是否这样做,但是可以。
使用非顺序ID的另一个原因是,它使“不公开”的视频起作用。这些视频不会显示在搜索结果中或作为建议,但是如果您具有链接,便可以访问。如果您使用的是顺序计数,则只需观看视频,将ID增加1,就可以打破不公开视频的想法。
非顺序ID还可帮助向竞争对手隐藏信息,例如视频总数或每个时间段上载的视频数量。
我强烈推荐汤姆·斯科特(Tom Scott)的视频。他的信息几乎总是有趣且准确的。
整数不能很好地扩展,一个“正常”的32位无符号整数将最多超过40亿。
他们可能不想让您知道他们在线上有多少物品或跟踪他们的增长率。
字母比数字可以容纳更多的信息,表示相同的“数字”所需的字母更少。对于大型索引器数据库,这可能加起来。
1)为什么某些网站在ID中使用字母?他们是琴弦吗?
我们不知道这些网站是否将ID作为字符串存储在其数据库中。数字和字符串对于计算机而言实际上是相同的。字符串只是一个数字,只是以不同的底数显示。'A' = 0x41 = 65 = 0b1000001
,到计算机都一样。但是,如果显示它,则基数越大,表示形式越短,URL越短,人类就越容易阅读和共享。像YouTube和Imgur这样的网站使用的基数为62(字母,大写和小写字母以及数字)或更大(添加破折号或其他有效的URL字符),这对于大数字而言相对较短。你喜欢什么用,youtu.be/23489234892348234933
还是youtu.be/B9k6KMrv8vh
?
2)为什么使用非顺序ID?
IMil的回答很好地解释了这一点:
由于以下两个原因,Youtube无法使用顺序ID:
几乎可以肯定其数据库是分布式的,这使得顺序编号变得复杂。
它具有一个隐私选项“不公开的视频”:那些不会显示在搜索结果中的视频,但是如果您知道ID,则可以使用。
这些也解释了为什么ID这么大的原因:(YouTube显然没有托管23,489,234,892,348,234,933,933个不同的视频)
生成ID时,如果不小心两次生成相同的ID,就会出现问题,因此您需要较大的ID空间以防止生日问题
如果用于视频的任何给定有效ID的机会不是很小,那么人们只能猜测未公开视频的URL。
People can just guess the URL of unlisted videos if the chance of any given valid ID being used for a video isn't very, very small.
-您如何知道除作者以外的所有人是否都无法访问未公开的视频?即使其他人已经猜到了它的ID
为什么不只是整数,尤其是顺序整数?在什么情况下,明智的决定是使用这种字符串ID而不是整数?
顺便说一句,内部表示形式不一定是字符串。他们很可能将数字标识符编码为较短网址的字母数字字符串。
正如您所指出的那样,仅使用数字就可以使用通用唯一ID,因为在幕后一切都是正义的0
,1
并且您可以将数字扩展到更高的精度,最高可达128位或更高。
我认为主要原因是,假设有一些任意固定范围uint32
(仅出于示例目的),如果您也使用字母,则总共可以使用较短的ID。
我认为这是URL的美学原因。而不是4,129,873,773
带有字母,它要短得多Fu837t
(由我虚构)。用户甚至可以记住将其提供给朋友的URL。像Youtube这样的平台通常具有比32位更长的UUID,因为它们会很快耗尽空间。
使用非数字ID的原因有多种,但也可以理解并非所有带字母字符的值都是真正的字符串。YouTube以令人难以置信的视频数量而闻名,每分钟上传300个小时的视频(参考)。代表这些视频的唯一整数可能会变得很长,因此请使用诸如Base64 URL编码的数字(ref)之类的东西。
标识符表示的类型:
他们都有自己的优点和缺点。可用于标识符的唯一字符越多,表示数字所需的字符越少。基数64是一个很好的折衷方案,因为存在一个确定的变体,该变体适用于URL,并压缩表示6到8的数字(即大小的3/4)所需的字符数。
可读的字符串可用于博客,因为它们可以提高可搜索性,并且当记录数较少时,生成唯一的标题要容易得多。
在现有的不错的答案中找不到“哈希”一词,因此我们开始:
通常,数据可以通过其内容哈希而不是独立的人工ID来识别。这在git
像ZFS这样的软件或文件系统中尤为明显,其中使用内容散列的这一特殊属性不仅使内容变得更容易(例如重复数据删除),而且还具有其他一些不错的属性,例如琐碎的缓存,安全的历史记录,检测位腐烂等等
哈希通常以十六进制数字(或更大的字母空间)的形式出现,因此这就是为什么看不到整数ID的原因。在这些情况下,根本就没有整数。
如果您的数据对象是不可变的(例如,在ZFS或中git
),则哈希值很好。它们非常适合将图像存储在例如大型CDN上。我不知道这些特定的ID是否实际上是哈希,但是这确实是有道理的(正如MichaelKjörling所评论的那样,短 ID可能不是哈希的原因很明显-相比之下,git使用的SHA-1值是20字节或40十六进制数字)。
hashCode()
等。当然,哈希,随机碰撞的可能性就更高。
好的原因之一是,无论如何,字符都是作为字符而不是整数发送的。这是因为HTTP Get的工作原理。
当您说“为什么不使用整数?” 好了,然后将整数切碎,然后将每个数字作为字符发送,无论如何,您最终都会得到一串字符。那么,为什么不对角色使用所有选项呢?
还有人为因素:
以imgur为例:https : //imgur.com/ ***** / s6UqP
s6UqP,
每个字符的范围是:a到z的大写字母,a到z的小写字母,字符串中每个位置的0到9 = 26+ 26+ 10 = 62个选项。五个位置即916132832的可能组合。如果仅使用数字,则需要9位数字。
人们可以在内存中容纳大约7个对象,9位数字太多,5个字符是可行的。