为什么网站使用随机字母数字ID而不是数据库ID来标识内容?

6
为什么像YouTube、Imgur和其他大多数网站使用随机字符作为它们的内容ID,而不是像MySQL中自动递增创建的顺序数字?
为了说明我的意思:
在URL中:https://www.youtube.com/watch?v=QMlXuT7gd1I 结尾的QMlXuT7gd1I表示该页面上的特定视频,但我假设该视频在数据库中也有一个唯一的数字ID。为什么他们要创建和使用这个字母数字字符串,而不是使用视频的数据库ID?
我正在创建一个类似于上述URL中识别内容的网站,但我目前正在使用只有DB ID的方式。我考虑切换到随机字符串,因为所有主要网站都在使用它,但在实施之前,我想知道为什么要这样做。
谢谢!

1
在YouTube的情况下,你不会确定。很可能,字母数字标识符是视频各种元数据元素的组合的哈希值。hash(ID, TIME, LENGTH) - Ryan
它使它们可以用作秘密密钥,从而允许未列出的视频的使用。 - Jeremy
4个回答

9

有些网站之所以这么做是因为分片技术。

当你只有一个进程(一个服务器)写入时,可以使用自增id而不会出现重复的id,但是当你有多个服务器(带有多个进程)写入内容,例如Youtube,就不可能再使用自增id了。避免重复需要同步的成本将是巨大的。

例如,如果你阅读mongodb的objectid文档,你会看到id的结构如下:

  • 表示Unix纪元后秒数的4字节值
  • 3字节机器标识符
  • 2字节进程id
  • 从随机值开始的3字节计数器

最终,只有12个字节。问题在于,当你用十六进制表示时,看起来像是24个字节,但那只是在显示时。

这个系统的另一个优点是时间戳包含在id中,因此可以解耦id以获取时间戳。


谢谢。这个和克里斯蒂安的评论都很有道理。 - user3471040

5

首先,这不是一个随机字符串,它是基于id的计算结果。它们是这样的,因为字母数字具有更大的基数。

例如,99999999可以表示为1NJCHR

这里尝试不同的进制,学习更多相关知识。

你会发现这种方法更加简洁。这也是我能想象到的唯一原因,如果你的id像54389634589347534985348957863457438959734,那么使用这种方式是有意义的。

正如selfCameron所评论/回答的,有些情况下(尤其是YouTube),可能会有其他安全参数,比如时间和长度以某种方式计算在内,这样你就无法猜测出标识符。


4

除了上面Christian的回答外,使用基础计算、哈希值或其他非数字标识符的优势在于可以隐藏数据库大小不让竞争对手知晓。

即使您使用数字并将自动递增设置为从50,000开始,每次增加50等,也仍然可以对数据库的大小和增长进行有根据的猜测。非数字选项不能完全消除这种可能性,但它们在一定程度上会阻碍这种情况发生。


0

最终用户存在恶意输入的重大机会,如果不使用ID,用户无法猜测ID,因此也无法猜测数据库的大小。然而,其他人对基本计算的回答解释得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接