《唯一编年史:探索独特的ID算法的宇宙》
#网络开发人员 #云 #database #datascience

介绍

现代软件开发在很大程度上取决于独特的ID技术,这使得创建具有全球唯一,可扩展性且适合分布式系统的身份成为可能。我们将研究本文中的许多众所周知的独特ID算法,包括UUID,Snowflake ID,GUID,Objectid,Flake,ID和ULID。我们将研究其属性,使用情况和插图,以提供有关其有用性和优势的见解。

独特ID算法的解释

UUID(普遍唯一的标识符)

开放软件基金会(OSF)已将流行的128位标识符UUID标准化。它被表示为字母数字字符串,并保证了分散系统的独特性。

示例:550E8400-E29B-41D4-A716 446655440000

优点:

  • UUID被认为是普遍独特的,即使在分布式系统中,也可以减少碰撞的可能性。这种特征使任何生产的UUID都非常困难匹配任何现有的UUID。
  • 由于开放软件基金会对其标准化的标准化,在各种编程语言和框架中得到了广泛认可和支持。互操作性可以使许多平台之间的平稳兼容性和集成。
  • 随机性和低碰撞概率:通过使用时间戳,机器标识符和随机位,该方法可产生宽的命名空间和非常低的碰撞概率。在唯一识别是必不可少的情况下,例如数据库主要密钥,此特征是必不可少的。

缺点:

  • UUID被认为是普遍独特的,即使在分布式系统中,也可以减少碰撞的可能性。这种特征使任何生产的UUID都非常困难匹配任何现有的UUID。
  • 由于开放软件基金会对其标准化的标准化,在各种编程语言和框架中得到了广泛认可和支持。互操作性可以使许多平台之间的平稳兼容性和集成。
  • 随机性和低碰撞概率:通过使用时间戳,机器标识符和随机位,该方法可产生宽的命名空间和非常低的碰撞概率。在唯一识别是必不可少的情况下,例如数据库主要密钥,此特征是必不可少的。

变体

uuIDV1(基于时间的UUID):

这种变化通过融合计算机的MAC地址和当前时间戳来创建独特的识别。它包含前60位的时间戳,这可能会引发隐私问题。

以此为例:“ 6E32B072-27DE-11EC-8D3D-0242AC130003”

优点:

  • 包括一个时间戳,制作基于时间的计算并简单排序。
  • 因为将MAC地址和时间戳组合在一起,所以唯一性很高。

缺点:

  • 由于存在MAC地址信息,可能存在隐私问题。
  • 每个时间戳和MAC地址只能生产一个UUID。

uuIDV2(DCE安全性UUID):
该变体将posix uid/gid作为标识的一部分,并基于DCE 1.1规范。它不喜欢通用的UUID创建,并且通常不使用。

“ 2B6CBEEC-8A8D-211C-B05F-726D7C7A3A05”就是一个例子。

优点:

  • 通过将UUID与posix uid/gid相结合来启用安全和访问控制。

缺点:

  • 对于通用的UUID创建,
  • 都不经常使用。
  • 取决于DCE环境的特殊实施和情况。

uuIDV3(使用MD5哈希基于名称的UUID)
此变体从名称(字符串)和命名空间标识符(通常是UUID)创建一个UUID。它使用MD5哈希技术创建128位哈希,以确保命名空间内的唯一性。

“ A4C2AC29-463B-3E8B-B79D-1B6E8DB2EDC7”就是一个示例。

优点:

  • 基于命名空间标识符和名称,生成确定性的UUID。
  • 保证指定名称空间内的排他性。

缺点:

  • 使用一种称为MD5的哈希方法,它不太安全。
  • 仅限于MD5的个性和抵抗性。

uuidv4(随机uuid)
用于生产此版本的数字是随机或伪随机。它提供了很高的独特性,但省略了任何重要数据,例如时间戳或名称。

以此为例:“ EF72E537-01B2-4785-9E62-FCDD2BE06C2E”

优点:

  • 由于产生随机或伪随机数,很可能是唯一性的。
  • 不需要任何其他背景或信息。

缺点:

  • 没有有用的数据,例如名称或时间戳。
  • 大型分布式系统可能容易受到冲突的影响。

uuIDV5(使用sha-1哈希基于名称的UUID)
这种变化基于名称和名称空间标识而创建一个UUID,就像UUIDV3一样。但是它使用更可靠的SHA-1哈希技术而不是MD5。

“ 8B3A6DD0-96A8-5E9D-BFBE-7B5BA4F9B11D”是一个例子。

优点:

  • 基于命名空间标识符和名称,生成确定性的UUID。
  • 使用SHA-1哈希技术,该技术比MD5更安全。

缺点:

  • 仅限于SHA-1的奇异性和抗冲突性。
  • 在某些情况下,SHA-1被认为不太安全。

uuidv6(订购的基于时间的UUID)
尽管尚未标准化,但已建议将这种替代方案作为UUIDV1上方的开发。通过使用有序的时间戳代替MAC地址,它可以解决某些隐私问题。

“ D024C4F2-5192-69B6-87DD-71674CBCD58F”就是一个例子。

优点:

  • MAC地址被订购的时间戳替换为Alnay隐私问题。
  • 保留基于时间的UUID对基于时间和分类的活动的好处。

缺点:

  • 未标准化,uUID生成库可能不会广泛支持。
  • 有限的采用和可访问性。

雪花ID

Twitter创建了雪花ID技术,以在分散网络中产生独特的ID。它的64位整数由时间戳,一个工人ID和一个序列编号组成。

例如,“ 123456789012345678”

优点:

  • 雪花ID旨在在分布式网络中在全球范围内具有独特性。雪花ID可以通过融合时间戳,工人ID和序列编号来提供高水平的独特性,从而降低冲突的可能性。
  • 可伸缩性:分布式系统友好的雪花ID技术是为了牢记可扩展性而创建的。通过允许多个设备或过程同时生成ID而不会遇到冲突的情况,可以增加工人ID的添加水平扩展和增强性能。
  • 按时间顺序排列:雪花IDS的时间戳组件使生产ID的天然按时间顺序排列。在事件记录或基于时间的数据分析之类的情况下,保持生产ID的顺序至关重要时,此属性可能很有用。

缺点:

  • 对工人ID管理的依赖性:雪花ID依赖于分布式系统中分配和管理不同的工人ID,以提供独特性和防止冲突。结果,管理和组织工人ID分配变得更加困难。
  • 有限的工人容量:可能同时创建ID的不同工人的数量受雪花ID中的工人ID组件的大小约束。如果工人数量超过分配的位,则可能存在ID冲突或要求更大的ID空间。
  • 时钟漂移的潜力:为了产生时间戳,雪花ID取决于精确的系统时钟。生成ID的订购和唯一性可能会受到分布式设置中时钟同步可能很困难的分布式设置中的时钟漂移。

GUID(全球唯一标识符)

Microsoft Technologies经常使用一个称为GUID的128位标识符。为了确保全局唯一性,它结合了独特的元素,例如网络卡的MAC地址和系统时间戳。

“ 21EC2020-3AEA-4069-A2DD-08002B30309D”,例如。

优点:

  • 全球唯一性:GUID旨在通过融合了诸如网卡的MAC地址和系统时间戳等独特元素来提供全球唯一性。数据完整性得到了改善,因此分布式系统之间的碰撞较小。
  • GUIDS具有标准化的格式,通常表示为一系列由连字符或其他定界线隔开的字母数字字符。这种格式有助于使用GUID,并保证平台和系统兼容性。
  • 广泛支持:许多Microsoft Technologies和Frameworks支持指南。它们可以在多个平台上的开发人员访问,因为它们在C#等语言中得到了本地支持,并且也可以通过其他语言的库和模块获得。

缺点:

  • 可读性和长度:由于GUID是128位标识符,因此它们的字符串可能比其他标识符格式更长。这可能会影响可读性和有用的指南,尤其是在人类可读性至关重要的情况下。
  • 确定性生成:基于MAC地址和系统时间戳等独特元素,形成了GUID。因为它披露了有关系统的网卡以及可能的生成时间的信息,所以确定性的一代可能会引起隐私问题。
  • 存储空间:与替代标识符表单(例如基于整数的顺序ID)相比,将GUID作为主要密钥存储在数据库中可能会占用更多空间。增加的存储需求可能会对数据库速度产生影响,尤其是当有很多数据存储和很多交易活动时。

objectid(mongodb)

mongoDB使用12字节标识符objectid来专门标识集合中的每个文档。时间戳记,机器标识,过程标识符和序列编号都包括在内。

“ 60bba8740cd0f93d36eeaf5”就是一个例子。

优点:

  • 唯一性:MongoDB集合的标识符可以通过ObjectId唯一。每个objectID中都包含时间戳,机器标识,过程标识符和序列编号,并共同努力使每个objection独特。
  • 自动生成:当将文档插入mongoDB中时,将自动生成objectids,从而消除对手动标识符生成的需求。这简化了开发并降低了标识符冲突的可能性。
  • 可以通过objectId的时间戳组件按时间顺序排列文档。在基于时间的序列或运行基于时间的查询中获取数据时,这可能会有所帮助。

缺点:

  • MongoDB独有的:ObjectID仅与MongoDB兼容,并且可能与其他数据库系统不起作用。如果您需要与其他数据库集成或移至新的数据库,则可能需要转换或映射ObjectID格式。
  • 非连续序列:ObjectID具有序列编号,但由于它还包含时间戳和过程ID,因此不能保证连续数据。这可能会影响基于序列的可预测操作。
  • 大型存储可能性:ObjectID为每个标识符采用12个字节的存储空间,这通常比整数等标识符形式更多。在涉及大量数据存储的情况下,这可能会导致更高的存储需求。

Flake ID(Twitter的雪花启发ID)

Twitter雪花算法的变体称为片状ID。分布式系统中的可伸缩性可以通过包括时间戳,工人ID,数据中心ID和序列编号的64位ID来实现。

例如,“ 183140978932858368”

优点:

  • 分布式系统中的可伸缩性是薄片ID设计的目标。 Flake ID可能会在不同的计算机或过程中产生不同的标识符,而不会通过合并元素,例如时间戳,工作人员ID,数据中心ID和序列编号来碰撞。这种可伸缩性在涉及分布式基础架构和高数据流的情况下特别有用。
  • 排序:由于薄片ID具有时间戳组件,因此可以按时间顺序合理的方式排列产生的ID。在处理需要维护活动顺序或进行基于时间分析时的数据时,这可能会有所帮助。
  • 存储效率:与较长的识别表格,片状ID(64位整数)相比,可以更有效地存储。在存储空间优化至关重要的情况下,尤其是在使用大量数据时,Flake ID的简洁表示可能很有用。

缺点:

  • 依赖对唯一ID分配的依赖:要在分布式系统之间提供独特性,薄片ID需要有效地管理和分配唯一的Worker ID和数据中心ID。由于这种管理,系统的基础设施变得更加复杂和劳动密集型。
  • 有限的精度:Flake ID使用64位格式,该格式使每个组件(例如日期和工人ID)具有有限的范围。在某些用法实例中,当特定组件需要更准确性时,此限制的精度可能是一个缺点。
  • 对系统时间的依赖性:薄片ID的可靠性取决于精确的系统时钟的时间戳生成。生产ID的顺序和唯一性可能会受到时钟同步和时钟漂移等问题的影响。

ULID(普遍独特的词典分类标识符)

一个称为ULID的128位标识符结合了词典的可分解性和UUID独特识别的能力。按时间学分类的48位时间戳和80位随机组件使得

使得可能。

“ 01F9A2VX4XYPJVQRWJ8DYB3SFV”就是一个示例。

优点:

  • 与UUID相似,ULID提供了高水平的独特性,这使得创建标识符会碰撞的极为不可能。由于添加时间戳和随机元素,它们在分布式系统之间是独特的。
  • 词典可分解性:ULID在词典上是可分类的,使得根据创建时对数据进行排序和查询数据。对于保留事件或数据项的时间顺序至关重要的情况,这在情况下特别有用。
  • 紧凑的表示:与较长的标识符格式相比,ULID较小,因为它们表示为128位标识符。结果,它们对存储和传输都有效,尤其是在处理大量数据时。

缺点:

  • 时间戳组件的复杂性:ULID中存在时间戳组件,它取决于外部时间来源以维持精确的时间。实施复杂性可能通过需要在远程系统的同步和精确的时间戳来提高。
  • 依赖随机性:为了确保唯一性,ULID包含一个随机元素。必须从值得信赖的随机性来源产生强随机值,这可能会导致其他计算工作和对随机数生成工具的依赖性。

结论

总而言之,在独特的ID算法的有趣领域中,雪花ID是无与伦比的,提供了无与伦比的全球唯一性,可扩展性和保持时间顺序的能力。但是,导航实施过程需要熟练地管理工人ID,对员工的考虑以及时钟同步。是时候选择您在考虑选项时使用哪种独特的ID算法来雕刻项目的身份。您将使用什么标准来做出决定?探索您的替代方案,权衡权衡并解锁代码的独特潜力。您将在即将到来的项目中使用什么独特的ID算法?