SecureRandom.hex
=> "93dcf2eb24591d8846f6a9ec804eceff"
SecureRandom.random_number
=> 0.2754022060318716
SecureRandom.urlsafe_base64
=> "xCHCIA7qpCYJwBBFiddUTg"
SecureRandom.uuid
=> "a79b9a7a-2f1f-4dc1-a0f1-8136b9f919ac"
http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom
从文档上面看来,似乎只有 uuid
方法是绝对唯一的,其他几个文档上面没说,不知道是否唯一,有人知道么?
UUID 有一个生成算法是用计算机的网卡的 mac 地址作为 seed,因为网卡出厂前就由厂家的厂牌和批次号等手段确保了世界上每块网卡的 mac 地址不会重复,所以这种 UUID 可以被认为是安全的。但是在一般系统上取得 mac 的地址可能需要特殊的用户权限,所以这个方法不太流行。
理论上随机生成的 UUID 是有可能重复的,但是重复的概率小到了几乎不可能,所以是非常安全的。 http://en.wikipedia.org/wiki/UUID#Random%5FUUID%5Fprobability%5Fof%5Fduplicates
To put these numbers into perspective, one's annual risk of being hit by a meteorite is estimated to be one chance in 17 billion,[34] that means the probability is about 0.00000000006 (6 × 10−11), equivalent to the odds of creating a few tens of trillions of UUIDs in a year and having one duplicate.
UUID 又名 GUID
理论上有重复的可能性, 但是这个可能性非常地低, 低到,通常情况下,可以忽略不计。
细节如下:
GUID 在空间上和时间上具有唯一性, 保证同一时间不同地方产生的数字不同。 世界上的任何两台计算机都不会生成重复的 GUID 值。
由以下几部分的组合: 1 当前日期和时间,UUID 的第一个部分与时间有关,如果你在生成一个 UUID 之后,过几秒又生成一个 UUID,则第一个部分不同,其余相同。 2 时钟序列。 3 全局唯一的 IEEE 机器识别号,如果有网卡,从网卡 MAC 地址获得,没有网卡以其他方式获得。
http://baike.baidu.com/view/1052579.htm http://baike.baidu.com/view/185358.htm
以前做 MIS 系统,当数据库的记录,需要一个全局唯一标识的时候,就用 GUID。 这个情况尤其适用于,多个数据库的数据进行合并的时候。 ID 只能保证记录在一个数据库中唯一,但是不能保证在其他数据库中也唯一。
还有 C++ 的 Com 接口,也需要一个 GUID。 Windows 注册表中,全都是这些东西。
The version 4 UUID is purely random (except the version). It doesn’t contain meaningful information such as MAC address, time, etc.