日期:2014-04-26(该死, 又凌晨了)
原文参考:http://tools.ietf.org/html/rfc4122.htmlhtml
前言:高级与普通程序员的区别就是, 普通程序只复(cao)用(xie)代码片断, 而高级一点的无非就只知道点规范, 写点东西, 让其余人Copynode
本屌最讨厌的面试题是, XXX为何这么设计, TMD我哪知道啊, 创始人就这么写, 我也没辙啊!程序员
UUID, 又名全球独立标识(Globally Unique Identifier), 固然原名更高大上点儿, A.K.A 宇宙独立标识(Universally Unique Identifier). UUID最初用在一个本屌没听过的网络系统中, 而后被普遍应用到微软抄作系统.面试
UUID是128位(长度固定)unsigned integer, 可以保证(真的假的?)在空间(Space)与时间(Time)上的惟一性。并且无需注册机制保证, 能够按需随时生成。算法
据WIKI, 随机算法生成的UUID的重复几率为170亿分之一网络
因为UUID定长且与时间有关, 有必定可能性UUID会重复出现(大概在西元(A.D)3400, 与具体实现算法有关)dom
UUID生成算法最高支持10,000,000(一千万)每秒每台机器, 因此能够用做交易流水IDide
uuid(Python)和NSUUID(iOS)遵循本RFCui
[time-low]-[time-mide]-[time-high-and-version]-[clock-seq-and-reserved 和 clock-seq-low]-[node]加密
time-low = 32位 unsigned integer
time-mid = 16位 unsigned integer
time-high-and-version = 16位 unsigned integer(时间戳高位部分与版本(Version)号混合)
clock-seq-and-reserved = 8位 unsigned integer(时钟序列高位部分与预约义变量(Variant)混合组成)
clock-seq-low = 8位 unsigned integer
node = 48位 unsigned integer
urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
UUID采用Big-endian字节序排列
变量(variant), 或称作类型, 4 bytes, 包括如下4种(其中X为任意值):
0XX NCS兼容预留
10X RFC4122采用
110 微软兼容预留
111 还未定义, 留做之后它用
版本号(version), 4 bytes, 一共如下5个版本:
0001 时间的版本
0010 DCE Security
0011 MD5哈希
0100 (伪)随机数
0101 SHA-1哈希
时间戳(timestamp), 60bit:
版本1: 时间戳采用UTC时间,以100ns为间隔,重1582年10月15日00:00:00.00开始计算
时钟序列, 14bit:
版本1: 用来防止在时间回调的状况下,致使的UUID重复问题
若是有时间回调(可能有系统断电致使),若是生成器在回调时间以后有生成新的UUID,那么时钟序列应该改变, 若是新生成的UUID时钟序列可知,那么时钟序列递增便可; 若不可知, 那么时钟序列应重置到一个47位随机数,或一个47位高质量的伪随机数,而且第48位设置为1,用来区别真正的MAC地址(因为全部MAC地址在网卡中第48为0)
节点(node), 48bit:
版本1: 为主机MAC地址, 若主机有多个MAC地址,随机选其中一个, 若系统没有MAC地址, 则采用(伪)随机数.
其余版本请参考原文, 其中版本2没有在原文中叙述
128位中,每一位都是零, (A.K.A)
urn:uuid:00000000-0000-0000-0000-000000000000
感谢您的大驾光临, 不管您是习惯右手, 仍是左手点赞都木有关系, 若是本文对您有那么丁点儿帮助, 请用您最销魂的姿式点个赞. 若有问题请留言!