UUID 及其在 MySQL 中的使用


UUID 及其在 MySQL 中的使用

文章插图
 
1. UUID 是什么?UUID(Universally Unique Identifier 通用唯一识别码)用于标识资源唯一性 。理论上说,门牌号、电话号码、邮编、身份证号都是用来标识资源唯一性的,但为使用方便,不适合用一个无规律的字符串表示,UUID 主要还是在程序中使用 。
UUID 源自1980年代的 Apollo 电脑公司,是一个 128 位的标识符,理论上的总数有 2128个,也就是说,哪怕每纳秒产生 1 万亿个 UUID,也要 100 亿年才能用完 。因此,只要保证生成方法的散布足够好,统计概率上,UUID 重复的可能性约等于 0。
UUID 的具体规范可以参考 RFC 4122 。这个标准定义了 5 个版本的 UUID:
  1. 版本 1 根据时间和 mac 地址来生成 UUID 。MAC 地址用于保证设备唯一性 。通过在时间戳后加入 13-14 位的时钟序列,可以保证在同一台设备,同 1 秒内生成的 1630 亿个 UUID 不重复 。这个版本的 UUID 我们用得相对较少,一个原因是其中携带了设备信息 。1999 年,著名病毒梅丽莎的作者,因为代码中的 UUID 暴露了 MAC 地址信息,不到一个星期就被抓住了 。另一个原因是这个版本的 UUID 生成有规律,比较容易根据一个 UUID 推断到下一个 UUID 。
  2. 版本 2 是一个 DEC 安全的版本,RFC4122 中也没有详细说明具体实现方式,我们一般也用不到 。
  3. 版本 3 根据字符串和命名空间散列值(HASH)来获取 UUID 。由于 HASH 函数本身的特性,一般不用担心 UUID 冲突,或者别人根据散列值反推原数据的问题 。这个版本采用的是 MD5 散列值 。
  4. 版本 4 根据随机数生成 UUID,是我们比较常用的版本 。
  5. 版本 5 和版本 3 一样,也是根据散列值获取 UUID,不过采用的散列算法是 SHA-1 而不是 MD5,相较而言,RFC4122 推荐大家使用版本 5 而不是版本 3 。
【UUID 及其在 MySQL 中的使用】我们常看到的 UUID 往往被表示为 16 进制数字和横杠组成的字符串,比如:a3535b78-69dd-4a9e-9a79-57e2ea28981b,其中第二个横杠之后的第一个数字表示 UUID 版本,例子中这个 UUID 就是版本 4 的 。


    推荐阅读