【杂记】GUID&&随机数

1. GUID介绍

1.1 GUID&UUID

        UUID指通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用,则有 Linux ext2/ ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等。

        GUID全称为Globally Unique Identifier(全球唯一标识符),GUID是一个通过特定算法产生的二进制长度为128位的数字标识符,用于指示产品的唯一性。GUID 主要用于在拥有多个节点、多台计算机的网络或系统中,分配必须具有唯一性标识符。

1.2 GUID唯一性

        GUID是根据机器上网卡的MAC地址再加上一定的算法生成的唯一的序列。因全世界所有网卡的MAC地址都是唯一的,所以其在空间上是唯一的。GUID的算法,至少有两个主要的参数,一个是时间,另外一个就是你机器的软、硬件信息,用来定位你使用的电脑,同一台电脑不可能在同一时间运行两个GUID的算法。这又保证了其在空间唯一性的基础上,时间上的唯一性。

1.3 UUID的构成

        按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,UUID的缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID,在ColdFusion中可以用CreateUUID()函数很简单的生成UUID,其格式为:xxxxxxxx-xxxx- x xxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:3F2504E0-4F89-11D3-9A0C-0305E82C3301 (8-4-4-4-12),可用函数CreateGUID () UDF进行转换。使用UUID的好处在分布式的软件系统中(比如:DCE/RPC, COM+,CORBA)就能体现出来,它能保证每个节点所生成的标识都不会重复,并且随着WEB服务等整合技术的发展,UUID的优势将更加明显。根据使用的特定机制,UUID不仅需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用惟一标识符有非常大的区别。具体组成如下所示:

(1)当前日期和时间,UUID的第1个部分与时间有关。

(2)时钟序列

(3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得

1.4 UUID的格式

        UUID 的十六个八位字节被表示为 32个十六进制数字,以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36个字符(即三十二个英数字母和四个连字号),通用格式为xxxxxxxx-xxxx-Mxxx -Nxxx-xxxxxxxxxxxx,数字 N的一至四个最高有效位表示 UUID 变体( variant ),有固定两位10xx因此只可能取值8, 9, a, b。数字 M的四位表示 UUID 版本,当前规范有5个版本,M可选值为1, 2, 3, 4, 5 ;这5个版本使用不同算法,利用不同的信息来产生UUID,各版本有各自优势,适用于不同情景。

  1. version 1, date-time & MAC address
  2. version 2, date-time & group/user id
  3. version 3, MD5 hash & namespace
  4. version 4, pseudo-random number(伪随机数)
  5. version 5, SHA-1 hash & namespace

        其中使用较多的是版本1和版本4,其中版本1使用当前时间戳和MAC地址信息。版本4使用(伪)随机数信息,128bit中,除去版本确定的4bit和variant确定的2bit,其它122bit全部由(伪)随机数信息确定。因为时间戳和随机数的唯一性,版本1和版本4总是生成唯一的标识符。若希望对给定的一个字符串总是能生成相同的 UUID,使用版本3或版本5。

1.5 UUID生成器

  • Java UUID Generator (JUG):开源UUID生成器,LGPL协议,支持MAC地址。
  • UUID:特殊的License,有源码。
  • Java 5以上版本中自带的UUID生成器:好像只能生成Version 3/4的UUID。

2. 计算机的随机数生成

2.1 真随机数

        自然界中的有很多不确定的现象,例如一片沙漠中的各个沙粒的重量,或者大气中分子的热运动轨迹,通过对这些现象的测量,就可以获得真随机数,优质的真随机源头就是那些人类还无法把握其规律的自然现象。生活中比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等物理现象,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求较高。根据定义可看到,真随机数是依赖于随机数生成器。使用较多的就是电子元件中的噪音等较为高级、复杂的物理过程来生成。

2.2 伪随机数

        计算机程序中一般都是用伪随机。计算机首先要获得真随机数来做伪随机数算法的种子。真随机数可以从从自然现象中获取,例如读取一段时间耳机收到的噪音,或者内存条上的分子热运动信息。为何需要种子呢?计算机程序运行的结果是确定性的,输出的结果是可以预测的,而且是可以重复的,所以通过计算机程序是不能生产随机数的。但是有了种子,就可以去衍生出很多足够随机的随机数,也就是伪随机的数。为何需要生成伪随机数呢?如果程序运行需要很长或者很多的随机数,而能够获得的真随机数的长度和数量又都有限,那么就会用程序去生成伪随机数。

        列举简单的伪随机生成算法的例子。如果真随机数是121,那么可以把真随机数相乘然后取中间数的方式来获得伪随机数。121乘以121是14641,那么去掉头和尾,取中间数就获得中间数464。这个464就是伪随机数,而121就是它的种子。如果要生成第二个伪随机数,就可以把464作为种子重复相同的操作。总之,伪随机数是以真随机数为种子去按照算法生成的

2.3 真伪区别

        按照真随机数的提取方法,不管取多少次,都可以看到各个输出是无规律的。但是伪随机数是计算出来的,如果原始种子比较短,很快伪随机数就出现周期性的重复了。当然,种子越长,周期也就会越长。两位数的种子,能够生产100个伪随机数,也就是说,周期是100,三位种子的周期是1000。给定位数长度,真随机数安全性比较高。而伪随机的特点就是可以方便的获取多个,或者由较短的真随机能够获得一个程序所需要的较长的伪随机,但是伪随机是有一定规律的,同样位数的伪随机肯定没有真随机安全。不过,伪随机数的周期越长,就越安全。

2.4 生成算法

        具体过程,详见文章:伪随机数生成算法 - shine-lee - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值