最新消息:阿里云双12优惠,史上最低折扣。

uuid通用唯一识别码的实现原理

服务器租用 aliyun 164浏览

restful架构理解以及其常见误区,避免踩坑必备!

RESTFUL是一种网络应用程序的设计风格和开发方式,本文对其原理进行深入阐述,以及其一些常见误区进行举例。

uuid其实是单词Universally Unique Identifier的缩写,汉语意思叫“通用唯一识别码”是用于计算机体系中以识别信息数目的一个128位标识符根据标准方法生成,不依赖中央机构的注册和分配,UUID具有唯一性,这与其他大多数编号方案不同。重复UUID码概率接近零,可以忽略不计。

一、uuid如何保持唯一性(算法原理)

UUID Version 1:基于时间的UUID

基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。

Python应用

>>> import uuid

>>> uuid.uuid1()

UUID(‘444b5cc0-ae5d-11e6-8d22-28924a431726’)

>>> uuid.uuid1()

UUID(’46a9bf21-ae5d-11e6-9549-28924a431726′)

UUID Version 2:DCE安全的UUID

DCE(Distributed Computing Environment)安全的UUID和基于时间的uuid算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。

UUID Version 3:基于名字的UUID(MD5)

基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。

Python应用

>>> import uuid

>>> uuid.uuid3(uuid.NAMESPACE_DNS, “myString”)

UUID(’21fc48e5-63f0-3849-8b9d-838a012a5936′)

>>> uuid.uuid3(uuid.NAMESPACE_DNS, “myString”)

UUID(’21fc48e5-63f0-3849-8b9d-838a012a5936′)

UUID Version 4:随机UUID

根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。

>>> import uuid

>>> uuid.uuid4()

UUID(‘e584539d-a334-4f15-9819-88d73fcf707d’)

>>> uuid.uuid4()

UUID(’76ec02cc-1b1d-4ad3-bd09-a4f6d67c7af4′)

UUID Version 5:基于名字的UUID(SHA1)

和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。

二、uuid算法源码

uuid在线生成工具:https://1024tools.com/uuid

 

Twitter推出的在分布式环境生成唯一ID的算法

前生成12位真随机数源码:

// Generate a new prefix from crypto/rand.// This call *can* drain entropy and will be called automatically when we exhaust the sequential range.// Will panic if it gets an error from rand.Int()func (n *NUID) RandomizePrefix() {

  var cb [preLen]byte

  cbs := cb[:]

  if nb, err := rand.Read(cbs); nb != preLen || err != nil {

    panic(fmt.Sprintf(“nuid: failed generating crypto random number: %v/n”, err))

  }

  for i := 0; i < preLen; i++ {

    n.pre[i] = digits[int(cbs[i])%base]

  }

}

后10位伪随机数

// Generate the next NUID string.func (n *NUID) Next() string {

 // Increment and capture.

  n.seq += n.inc

  if n.seq >= maxSeq {

    n.RandomizePrefix()

    n.resetSequential()

  }

  seq := n.seq

  // Copy prefix

  var b [totalLen]byte

  bs := b[:preLen]

  copy(bs, n.pre)

  // copy in the seq in base36.

  for i, l := len(b), seq; i > preLen; l /= base {

    i -= 1

    b[i] = digits[l%base]

  }

  return string(b[:])

}

生成的结果示例: M4bZr7xyO3toV6T6iC7lWB

转载请注明:小猪云服务器租用推荐 » uuid通用唯一识别码的实现原理