目录

唯一id

UUID

UUID是由一组32位数的16进制数字所构成,所以UUID理论上的总数为16^32=2^128。 以连字号分为五段,形式为8-4-4-4-12的32个字符。示例: 550e8400-e29b-41d4-a716-446655440000

为保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素。

UUID具有多个版本,每个版本的算法不同,应用范围也不同。

  1. 基于时间的UUID 基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。
  2. DCE安全的UUID DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
  3. 基于名字的UUID(MD5) 基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
  4. 随机UUID 根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的。

snowflake(雪花id)

./pic1.jpg

  • 时间戳。时间戳段位共41位,单位毫秒,可以使用约70年。为了增加剩余可用期限,一般都会把起始日期尽量后移而不是直接使用1970-01-01。(ps:如果是使用1970,你的程序只能支持到2039年了)
  • 机器id。用于区分集群内不同机器,因为Snowflake生成ID是在每台机器上进行的。5个bit是数据中心,5个bit的机器ID
  • 序列号。由于高并发的特性,即使时间戳精确到了毫秒,也有可能出现重复。序列号用于同一时间戳下生成多个id。12位的长度,同一机器一毫秒可以有2^12=4096个id。

总结

uuid参数的数据长度32位,比较长;无序,没有规律; snowflake长度为64bit位二进制,可以转为int64;总体呈现递增趋势;如果时间回拨,会有重复的风险