例如,YouTube使用的视频ID不是简单的数字,而是区分大小写的字母数字字符串(如dQw4w9WgXcQ)。为什么某些网站,如YouTube和Dailymotion使用字母数字字符串来处理这些ID,而不是使用普通数字?
一个显而易见的答案可能是,结果的is会更短(例如,将它们编码在Base-64而不是Base-10中),但我发现有趣的是其他网站(如Vimeo )没有使用这种技术。
还有什么好的理由吗?
发布于 2015-11-03 21:09:20
首先,请参阅帽定理。它类似于一句古老的格言:“快,好,便宜:挑2”。
在理论计算机科学中,CAP定理,也称为Brewer定理,指出分布式计算机系统不可能同时提供以下三种保证:
保持序列化的数字需要一致性..。一个是数字守护者的地方。在大型系统中,这可以成为一个瓶颈,一个单一的故障点,或者两者兼而有之。在分布式系统中,通常会开始放松这种约束(一致性),以利于其他两种系统。
在分布式系统(如HI-LO算法或其派生程序)中,有维护序列化数字标识的策略,但在节点故障时仍然可以跳过大量数字。
另一种常见的方法是使用UUID,这是一个随机生成的标识符(是Int64大小的两倍),它与任何其他生成的UUID相比具有很高(但不是100%)的惟一性。基本上是一个很大的随机数。这对于客户端操作来说很好,因为客户机可以很好地生成它,并且有很好的唯一性,并随后使用它来识别或跟踪事物。但是冲突(生成相同的ID )是可能的(特别是如果客户端有一个可怕的RNG),并且仍然必须处理。
我怀疑youtube的识别者是uuid的一些较短的变体,然后被转换成没有标点符号的base64变体。因为标点符号扼杀了链接中使用的能力。因此,它是一个非常大的数字(随机的或序列化的)已经转换为文本,以使它更短。
一个相当流行的标识符格式是“实体-#”或“系统-实体-#”,如果您有许多跨操作系统的话。#是由拥有的系统(仍然是分布在多个系统、微服务或其他方面)一致生成的,或者具有HI-LO变体。为了显示的目的,去掉前缀并只使用数字部分是非常简单的。
以上显然不是一个完整的列表,最后它们都是磁盘上的二进制数字。使用其中一种或另一种的原因是对您的系统最有利的架构权衡。UUID对于分布式系统来说是最方便的体系结构属性,但是对于人为因素(用户可以记住并键入102875,而不是B9FE6378-E76C-40D5-883B-72FE376952A4,我刚刚制作的UUID)。
如果所识别的内容有任何不明确之处,那么UUID或数字都不是特别有用的,但是字符串是很好的。至少,序列化的数字可以给你一个比例的概念,这可以暗示什么是被引用的。
当然,我提到了字符串标识符的安全性问题,因为它可以让潜在攻击者深入了解您的系统。
我甚至见过一篇博客文章回避数字标识符,因为当用户获得低编号资源(例如帐户#5)时,它给人的印象是.我并不认为这是有价值的。毕竟,如果用户信心是一个有效的商业关注点,您可以始终以6位数开始您的数字序列。编辑:趋势分析可能是一个增加ID的安全问题。
发布于 2015-11-03 20:46:43
还有什么好的理由吗?
好的。可能有很多很好的理由,尽管它们可能不是激发YouTube、DailyMotion等的原因:
发布于 2018-09-20 18:25:07
我一直认为理由是双重的和相当简单的:
Siebel在他们的CRM系统中使用了类似的方法。
这个堆栈溢出回答对这个主题进行了很好的讨论。
基本上每个youtube ID都是一个64位的数字。我很怀疑他们会用光这些东西。64比特足以让地球上的每一个人上传20亿个视频。
https://softwareengineering.stackexchange.com/questions/301620
复制相似问题