# 前言

在数据库中作为主键来使用的唯一标识一般分为两种:

  1. 数字自增
  2. GUID(128 位二进制数,在表示上通常是 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 的 16 进制数, - 仅方便显示,并不没有实际占用)

而当需要利用的分表的时候,数字自增的 ID 并不利于分表 (会造成不同表可能存在相同的 Id),因此常用的是 GUID 作为主键。为了保证递增的特点,在生成 GUID 的时候常常与时间戳相绑定,这样在搜索查询的时候可以直接使用主键进行排序,大大提高性能。

# 雪花算法

在分布式系统中要创建一个全局并且随着时间递增的唯一标识,常用的方法就是雪花算法,其主要的特点就是:时间戳 + 机器码
雪花算法为 64 位的二进制组成(即对应 cpp 的 long long,java 的 long 类型,其占用大小是标准 GUID 的一半)
它的组成:
0 - 0000...000 - 000...0 - 000...0
四个部分,第 1 位空置位永远为 0,第 2-42 位(总共 41 位)为时间戳(毫秒级别),第 43-52 位(总 10 位)为机器码(可以分为数据中心 Id + 机器 Id),第 53 位到 64 位(总 12 位)为序列号(自增的序列,最多表示 4096)

更新于 阅读次数