为什么YouTube,Imgur和其他大多数网站都使用随机字符作为内容ID,而不仅仅是序列号,就像MySQL中自动增量创建的那样?
解释我的意思:
在网址中:https://www.youtube.com/watch?v=QMlXuT7gd1I
最后的QMlXuT7gd1I表示该页面上的特定视频,但我假设该视频在数据库中也有唯一的数字ID。为什么他们创建和使用这个字母数字字符串而不是仅使用视频的数据库ID?
我正在创建一个标识URL中内容的网站,但我目前只使用数据库ID。我正在考虑切换到随机字符串,因为所有主要网站都这样做,但我想知道为什么在我实现它之前完成它。
谢谢!
答案 0 :(得分:8)
有些网站因为分片而这样做。
如果只有一个进程(一个服务器)编写,则可以创建自动增量ID而不会出现重复的ID,但是当您有多个服务器(具有多个进程)编写内容时,如youtube,它&#39 ; s不再使用autoincrement id。避免重复的同步成本将是巨大的。
例如,如果您阅读mongodb's ocjectid documentation,您可以看到id的此结构: 一个4字节的值,表示自Unix纪元以来的秒数, 一个3字节的机器标识符, 一个2字节的进程ID,和 一个3字节的计数器,以随机值开始。
最后,它只有12个字节。问题是当你用十六进制表示时,它看起来像是24个字节,但只有当你显示它时才会这样。
此系统的另一个优点是时间戳包含在id中,因此您可以将ID解耦以获取时间戳。
答案 1 :(得分:5)
首先,这不是一个随机字符串,它是一个依赖于id的基本计算。他们这样做,因为字母数字有一个更大的基础
99999999
之类的内容可能是1NJCHR
看看here,并与基地一起玩,并了解更多信息。
你会发现它更短。这是我能想象的唯一原因,有人会这样做,如果你有像54389634589347534985348957863457438959734
当self和Cameron评论/回答时,有机会(特别是youtube)有额外的安全参数,如时间和长度以某种方式计算到它,所以你不能猜一个标识符。
答案 2 :(得分:4)
除了上面的克里斯蒂安回答,使用基本计算,散列值或其他非数字标识符的优点是可以从竞争对手那里掩盖数据库的大小。
即使您使用数字并将auto_increment设置为50,000开始,增加50等,仍然可以根据db的大小和增长进行有根据的猜测。非数字选项不会消除这种可能性,但它们会在一定程度上抑制它。
答案 3 :(得分:0)
最终用户存在恶意输入的主要机会,并且不使用ID用户无法猜测ID,因此无法猜测db的大小。然而,其他基础计算的答案解释得很清楚。