zoukankan      html  css  js  c++  java
  • Java UUID的底层原理

    详情参阅:https://www.cnblogs.com/throwable/p/14343086.html

    UUID的几个核心特定:

    全局时空唯一性
    固定长度128比特,也就是16字节(1 byte = 8 bit)
    分配速率极高,单机每秒可以生成超过1000万个UUID(实际上更高)

    UUID是Universally Unique IDentifier的缩写,翻译为通用唯一标识符或者全局唯一标识符。UUID的长度为128比特,可以保证在空间和时间上的唯一性。

    UUID本质是一个128比特的数字,这是一个位长巨大的数值,理论上来说,UUID的总数量为2^128个。这个数字大概可以这样估算:如果每纳秒产生1兆个不相同的UUID,需要花费超过100亿年才会用完所有的UUID。

    UUID的变体与版本

    UUID标准和算法定义的时候,为了考虑历史兼容性和未来的扩展,提供了多种变体和版本。接下来的变体和版本描述来源于维基百科中的Versions章节和RFC 4122中的Variant章节。

    目前已知的变体如下:

    变体0xx:Reserved, NCS backward compatibility,为向后兼容做预留的变体
    变体10x:The IETF aka Leach-Salz variant (used by this class),称为Leach–Salz UUID或者IETF UUID,JDK中UUID目前正在使用的变体
    变体110:Reserved, Microsoft Corporation backward compatibility,微软早期GUID预留变体
    变体111:Reserved for future definition,将来扩展预留,目前还没被使用的变体

    目前已知的版本如下:

    0:空UUID(特殊版本0),用00000000-0000-0000-0000-000000000000表示,也就是所有的比特都是0
    1:date-time and MAC address(版本1):基于时间和MAC地址的版本,通过计算当前时间戳、随机数和机器MAC地址得到。由于有MAC地址,这个可以保证其在全球的唯一性。但是使用了MAC地址,就会有MAC地址暴露问题。若是局域网,可以用IP地址代替
    2:date-time and MAC address, DCE security version(版本2):分布式计算环境安全的UUID,算法和版本1基本一致,但会把时间戳的前4位置换为POSIX的UID或GID
    3:namespace name-based MD5(版本3):通过计算名字和命名空间的MD5散列值得到。这个版本的UUID保证了:相同命名空间中不同名字生成的UUID的唯一性;不同命名空间中的UUID的唯一性;相同命名空间中相同名字的UUID重复生成是相同的
    4:random(版本4):根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,还有一个特点就是预留了6比特存放变体和版本属性,所以随机生成的位一共有122个,总量为2^122,比其他变体的总量要偏少
    5:namespace name-based SHA-1(版本5):和版本3类似,散列算法换成了SHA-1

    其中,JDK中应用的变体是Leach-Salz,提供了namespace name-based MD5(版本3)和random(版本4)两个版本的UUID生成实现

    UUID的格式

    UUID串是有格式要求的,通常是36个字符(32个字符加上4个连字符):格式为8-4-4-4-12,其中有效部分未32个字符。被连字符连起来的各部分有各自的含义,如时间戳、版本号等。

    详情见前面的参考文章。

  • 相关阅读:
    二阶注入
    ACCESS延时注入
    宽字节注入源码
    Sqli-LABS通关笔录-14
    Sqli-LABS通关笔录-13
    Sqli-LABS通关笔录-12
    PHP学习路线
    华科机考:二叉排序树
    华科机考:打印日期
    华科机考:A+B
  • 原文地址:https://www.cnblogs.com/z-sm/p/14653484.html
Copyright © 2011-2022 走看看