相对而言,UUID/GUID 是一种计算上快速而简单的方法,可以生成一个假定为普遍唯一的 ID。这在许多需要集成来自先前未连接系统的数据的系统中非常重要。例如: 如果您有一个内容管理系统,它运行在两个不同的平台上,但是在某个时候需要将内容从一个系统导入到另一个系统中。您不希望 ID 发生更改,因此系统 A 中数据之间的引用保持不变,但是您不希望与系统 B 中创建的数据发生任何冲突。UUID 可以解决这个问题。
版本1的 UUID 是最常见的。它们使用网卡的 MAC 地址(除非欺骗,否则应该是唯一的) ,加上一个时间戳,再加上通常的位操纵来生成 UUID。对于没有 MAC 地址的机器,6个节点字节由一个加密安全的随机数生成器生成。如果生成两个 UUID 的顺序快到时间戳与前一个 UUID 匹配,则时间戳增加1。冲突不应该发生,除非发生以下情况之一: MAC 地址被欺骗; 一台运行两个不同 UUID 生成应用程序的机器在同一时刻生成 UUID; 两台没有网卡或没有用户级访问 MAC 地址的机器被给予相同的随机节点序列,并在同一时刻生成 UUID; 我们用完字节来表示时间戳和回滚到零。
实际上,这些事件都不是偶然发生在单个应用程序的 ID 空间中的。除非您在互联网范围内接受 ID,或者在一个不可信的环境中,在这种环境中,恶意用户可能会在 ID 冲突的情况下做一些坏事,否则这不是您应该担心的事情。如果您碰巧生成了与我相同的版本4 UUID,那么理解这一点是至关重要的,在大多数情况下,这并不重要。我在一个完全不同的 ID 空间中生成了这个 ID。我的应用程序永远不会知道碰撞,所以碰撞并不重要。坦率地说,在没有恶意行为者的单个应用程序空间中,地球上所有生命的灭绝将在碰撞发生之前很久就发生,即使是在版本4的 UUID 上,即使您每秒生成相当多的 UUID。
还有,2 ^ 64 * 16是256EB。例如,您需要存储256EB 的 ID,然后才有50% 的机会在单个应用程序空间中发生 ID 冲突。