之前无意间看到群友讨论到用什么做主键比较好
其实 UUID 和自增主键 ID 是常用于数据库主键的两种方式,各自具有独特的优缺点。
UUID 是一个由 128 位组成的唯一标识符,通常以字符串形式表示。它可以通过不同的算法生成,例如基于时间戳的 UUID(version 1)和基于随机数的 UUID(version 4)等。
然而,UUID 作为主键 ID 也存在一些缺点:
在 MySQL 中,可以通过设置 AUTO_INCREMENT 属性实现 ID 的自增长,通常用于作为主键 ID。
使用自增 ID 作为主键的好处包括:
然而,使用自增主键也存在一些问题:
UUID(Universally Unique Identifier)是一种全局唯一标识符,用于在同一时空中的各台机器上保证唯一性。
UUID 的生成基于特定算法,通常使用随机数生成器或基于时间戳的方式。生成的 UUID 以 32 位 16 进制数表示,总共 128 位(标准 UUID 格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,共 32 个字符)。
由于 UUID 是由 MAC 地址、时间戳、随机数等信息生成的,因此具有极高的唯一性,几乎不可能重复。但在实际实现中,UUID 有多种版本,它们的唯一性指标也有所不同。
UUID 的具体实现版本包括基于时间的 UUID V1 和基于随机数的 UUID V4 等。
在 Java 中,java.util.UUID
生成的 UUID 包括 V3 和 V4 两种版本。
UUID 的优点在于其性能较高,不依赖网络,可以在本地生成,并且使用起来相对简单。
然而,UUID 也存在两个明显的缺点:
基于时间戳的 UUID 是通过计算当前时间戳、随机数和机器 MAC 地址得到的。由于算法中使用了 MAC 地址,这个版本的 UUID 能够确保在全球范围内的唯一性。然而,使用 MAC 地址也带来了安全性问题,因此这个版本的 UUID 受到了批评。如果应用只在局域网中使用,也可以使用一种简化的算法,以 IP 地址代替 MAC 地址。
这个版本的 UUID 算法与基于时间戳的 UUID 相同,但会将时间戳的前 4 位替换为 POSIX 的 UID 或 GID。然而,实际中较少使用这个版本的 UUID。
基于名称空间的 UUID 通过计算名称和名称空间的 MD5 散列值得到。这个版本的 UUID 保证了以下几点:在相同名称空间中,不同名称生成的 UUID 具有唯一性;不同名称空间中的 UUID 是唯一的;在相同名称空间中,相同名称生成的 UUID 是重复的。
基于随机数的 UUID 是根据随机数或伪随机数生成的。该版本的 UUID 使用随机数生成器生成,保证了生成的 UUID 具有极佳的唯一性。然而,由于其基于随机数,因此不太适用于数据量特别大的场景。
与版本 3 的 UUID 算法相似,但使用 SHA1(Secure Hash Algorithm 1)算法进行散列值计算。
Version 1 和 Version 2:
Version 3 和 Version 5:
Version 4:
好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。