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通用唯一识别码的实现原理