UUID就是Universal Unique IDentifier的缩写,它是一个128位,16字节的值,并确保在时间和空间上惟一。
它是把硬件地址、时间以及随机数结合在一块儿,它保证对在同一时空中的全部机器都是惟一的。javascript
一般平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由如下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,若是你在生成一个UUID以后,过几秒又生成一个UUID,则第一个部分不一样,其他相同),时钟序列,全局惟一的IEEE机器识别号(若是有网卡,从网卡得到,没有网卡以其余方式得到),UUID的惟一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最广泛的是微软的GUID (Globals Unique Identifiers)。
通常状况下,生成算法用计算机网卡的地址和一个60位的timestamp生成,时间是以100ns为时间间隔。
例如,一台300PL 6862的计算机,主板集成的网卡的MAC地址为00-04-AC-2E-B7-DC,而UUID的最后六个字节也会是0004AC2EB7DChtml
通常咱们都知道使用Java如何建立UUID,以下:java
java类:java.util.UUIDgit
UUID是1.5中新增的一个类,在java.util下,用它能够产生一个号称全球惟一的ID算法
import java.util.UUID; public class TestGUID { public static void main(String[] args) {//用main方法是为了测试方便 UUID uuid = UUID.randomUUID(); //实际项目中只有这句有用 System.out.println (uuid); } }
编译运行输出如:c9d6294f-0c62-453f-8626-68c7b0fc9769数据结构
若是想在js中使用uuid咱们可使用以下方法生成:less
<span style="font-size:18px;">/*! Math.uuid.js (v1.4) http://www.broofa.com mailto:robert@broofa.com Copyright (c) 2010 Robert Kieffer Dual licensed under the MIT and GPL licenses. */ /* * Generate a random uuid. * * USAGE: Math.uuid(length, radix) * length - the desired number of characters * radix - the number of allowable values for each character. * * EXAMPLES: * // No arguments - returns RFC4122, version 4 ID * >>> Math.uuid() * "92329D39-6F5C-4520-ABFC-AAB64544E172" * * // One argument - returns ID of the specified length * >>> Math.uuid(15) // 15 character ID (default base=62) * "VcydxgltxrVZSTV" * * // Two arguments - returns ID of the specified length, and radix. (Radix must be <= 62) * >>> Math.uuid(8, 2) // 8 character ID (base=2) * "01001010" * >>> Math.uuid(8, 10) // 8 character ID (base=10) * "47473046" * >>> Math.uuid(8, 16) // 8 character ID (base=16) * "098F4D35" */ (function() { // Private array of chars to use var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); Math.uuid = function (len, radix) { var chars = CHARS, uuid = [], i; radix = radix || chars.length; if (len) { // Compact form for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix]; } else { // rfc4122, version 4 form var r; // rfc4122 requires these characters uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; uuid[14] = '4'; // Fill in random data. At i==19 set the high bits of clock sequence as // per rfc4122, sec. 4.1.5 for (i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | Math.random()*16; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } } return uuid.join(''); }; // A more performant, but slightly bulkier, RFC4122v4 solution. We boost performance // by minimizing calls to random() Math.uuidFast = function() { var chars = CHARS, uuid = new Array(36), rnd=0, r; for (var i = 0; i < 36; i++) { if (i==8 || i==13 || i==18 || i==23) { uuid[i] = '-'; } else if (i==14) { uuid[i] = '4'; } else { if (rnd <= 0x02) rnd = 0x2000000 + (Math.random()*0x1000000)|0; r = rnd & 0xf; rnd = rnd >> 4; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } return uuid.join(''); }; // A more compact, but less performant, RFC4122v4 solution: Math.uuidCompact = function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); }; })();</span>
全局惟一标识符,简称GUID(发音为 /ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的惟一标识,一般表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA-1069-A2DD-08002B30309D},它实质上是一个128位长的二进制整数。GUID一词有时也专指微软对UUID标准的实现。dom
GUID的主要目的是产生彻底惟一的数字。在理想状况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数也足够大,达到了2128(3.4×1038)个,因此随机生成两个相同GUID的可能性是很是小的,但并不为0。因此,用于生成GUID的算法一般都加入了非随机的参数(如时间),以保证这种重复的状况不会发生。测试
下面是生成Guid代码实现,优势是代码量极少:ui
// Generate four random hex digits. function S4() { return (((1+Math.random())*0x10000)|0).toString(16).substring(1); }; // Generate a pseudo-GUID by concatenating random hexadecimal. function guid() { return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()); };
下面是几种生成Guid的算法来自(http://www.cnblogs.com/snandy/p/3261754.html)
一、
function uuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 s[8] = s[13] = s[18] = s[23] = "-"; var uuid = s.join(""); return uuid; }
2.
function guid() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); return v.toString(16); }); }
三、
这个能够指定长度和基数:
// 8 character ID (base=2)
uuid(8, 2)
// "01001010"
// 8 character ID (base=10)
uuid(8, 10)
// "47473046"
// 8 character ID (base=16)
uuid(8, 16)
// "098F4D35"
function uuid(len, radix) { var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); var uuid = [], i; radix = radix || chars.length; if (len) { // Compact form for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix]; } else { // rfc4122, version 4 form var r; // rfc4122 requires these characters uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; uuid[14] = '4'; // Fill in random data. At i==19 set the high bits of clock sequence as // per rfc4122, sec. 4.1.5 for (i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | Math.random()*16; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } } return uuid.join(''); }