二:UUID的形式是:4-2-2-2-6,共4+2+2+2+6=16个字节。比如,550e8400-e29b-41d4-a716-446655440000 。其中,第3部分的第一个字节(即总体上的第7个字节)的高4位用来表示uuid的version类型。version表明了uuid的算法版本,目前有如下几种:
1,version1:version1是第一次提出来的算法,算法使用了唯一硬件地址(比如,网卡啊,cpu编号啊)+精确到100纳秒的时间,还有其他的一些数据来产生结果。可是,它被广泛的抵制了,因为根据uuid可以很容易的查到是那台电脑构建的(因为网卡地址唯一)。传闻说有一次网络攻击行为就是被这种方式给追踪到黑客的。
2,version3:第3版本的算法(很奇怪的是居然没有第2版本的算法),这个算法十分简单,就是使用md5算法hash一个唯一url地址。保证uuid的唯一需要你自己保证url地址的唯一。
3,version4:第4版本的算法,这个算法也很容易理解,它是直接使用一个随机数来构建uuid。随机数如何构建由自己决定。
4,version5:第5版本的算法,这个算法和第3版本的算法几乎一样,唯一不同的是它使用了sha-1算法代替md5算法来进行hash。
三:UUID在使用一
/**
*
* @author wangdei
* 在 http://www.bt285.cn BT下载
* http://www.5a520.cn 小说520 上使用.
*
*/
public class RandomGUID extends Object {
protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
.getLog(getClass());
public String valueBeforeMD5 = "";
public String valueAfterMD5 = "";
private static Random myRand;
private static SecureRandom mySecureRand;
private static String s_id;
private static final int PAD_BELOW = 0x10;
private static final int TWO_BYTES = 0xFF;
/*
* Static block to take care of one time secureRandom seed.
* It takes a few seconds to initialize SecureRandom. You might
* want to consider removing this static block or replacing
* it with a "time since first loaded" seed to reduce this time.
* This block will run only once per JVM instance.
*/
static {
mySecureRand = new SecureRandom();
long secureInitializer = mySecureRand.nextLong();
myRand = new Random(secureInitializer);
try {
s_id = InetAddress.getLocalHost().toString();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
/*
* Default constructor. With no specification of security option,
* this constructor defaults to lower security, high performance.
*/
public RandomGUID() {
getRandomGUID(false);
}
/*
* Constructor with security option. Setting secure true
* enables each random number generated to be cryptographically
* strong. Secure false defaults to the standard Random function seeded
* with a single cryptographically strong random number.
*/
public RandomGUID(boolean secure) {
getRandomGUID(secure);
}
/*
* Method to generate the random GUID
*/
private void getRandomGUID(boolean secure) {
MessageDigest md5 = null;
StringBuffer sbValueBeforeMD5 = new StringBuffer(128);
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
logger.error("Error: " + e);
}
try {
long time = System.currentTimeMillis();
long rand = 0;
if (secure) {
rand = mySecureRand.nextLong();
} else {
rand = myRand.nextLong();
}
sbValueBeforeMD5.append(s_id);
sbValueBeforeMD5.append(":");
sbValueBeforeMD5.append(Long.toString(time));
sbValueBeforeMD5.append(":");
sbValueBeforeMD5.append(Long.toString(rand));
valueBeforeMD5 = sbValueBeforeMD5.toString();
md5.update(valueBeforeMD5.getBytes());
byte[] array = md5.digest();
StringBuffer sb = new StringBuffer(32);
for (int j = 0; j < array.length; ++j) {
int b = array[j] & TWO_BYTES;
if (b < PAD_BELOW)
sb.append('0');
sb.append(Integer.toHexString(b));
}
valueAfterMD5 = sb.toString();
} catch (Exception e) {
logger.error("Error:" + e);
}
}
/*
* Convert to the standard format for GUID
* (Useful for SQL Server UniqueIdentifiers, etc.)
* Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
*/
public String toString() {
String raw = valueAfterMD5.toUpperCase();
StringBuffer sb = new StringBuffer(64);
sb.append(raw.substring(0, 8));
sb.append("-");
sb.append(raw.substring(8, 12));
sb.append("-");
sb.append(raw.substring(12, 16));
sb.append("-");
sb.append(raw.substring(16, 20));
sb.append("-");
sb.append(raw.substring(20));
return sb.toString();
}
// Demonstraton and self test of class
public static void main(String args[]) {
for (int i=0; i< 100; i++) {
RandomGUID myGUID = new RandomGUID();
System.out.println("Seeding String=" + myGUID.valueBeforeMD5);
System.out.println("rawGUID=" + myGUID.valueAfterMD5);
System.out.println("RandomGUID=" + myGUID.toString());
}
}
}
*
* @author wangdei
* 在 http://www.bt285.cn BT下载
* http://www.5a520.cn 小说520 上使用.
*
*/
public class RandomGUID extends Object {
protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
.getLog(getClass());
public String valueBeforeMD5 = "";
public String valueAfterMD5 = "";
private static Random myRand;
private static SecureRandom mySecureRand;
private static String s_id;
private static final int PAD_BELOW = 0x10;
private static final int TWO_BYTES = 0xFF;
/*
* Static block to take care of one time secureRandom seed.
* It takes a few seconds to initialize SecureRandom. You might
* want to consider removing this static block or replacing
* it with a "time since first loaded" seed to reduce this time.
* This block will run only once per JVM instance.
*/
static {
mySecureRand = new SecureRandom();
long secureInitializer = mySecureRand.nextLong();
myRand = new Random(secureInitializer);
try {
s_id = InetAddress.getLocalHost().toString();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
/*
* Default constructor. With no specification of security option,
* this constructor defaults to lower security, high performance.
*/
public RandomGUID() {
getRandomGUID(false);
}
/*
* Constructor with security option. Setting secure true
* enables each random number generated to be cryptographically
* strong. Secure false defaults to the standard Random function seeded
* with a single cryptographically strong random number.
*/
public RandomGUID(boolean secure) {
getRandomGUID(secure);
}
/*
* Method to generate the random GUID
*/
private void getRandomGUID(boolean secure) {
MessageDigest md5 = null;
StringBuffer sbValueBeforeMD5 = new StringBuffer(128);
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
logger.error("Error: " + e);
}
try {
long time = System.currentTimeMillis();
long rand = 0;
if (secure) {
rand = mySecureRand.nextLong();
} else {
rand = myRand.nextLong();
}
sbValueBeforeMD5.append(s_id);
sbValueBeforeMD5.append(":");
sbValueBeforeMD5.append(Long.toString(time));
sbValueBeforeMD5.append(":");
sbValueBeforeMD5.append(Long.toString(rand));
valueBeforeMD5 = sbValueBeforeMD5.toString();
md5.update(valueBeforeMD5.getBytes());
byte[] array = md5.digest();
StringBuffer sb = new StringBuffer(32);
for (int j = 0; j < array.length; ++j) {
int b = array[j] & TWO_BYTES;
if (b < PAD_BELOW)
sb.append('0');
sb.append(Integer.toHexString(b));
}
valueAfterMD5 = sb.toString();
} catch (Exception e) {
logger.error("Error:" + e);
}
}
/*
* Convert to the standard format for GUID
* (Useful for SQL Server UniqueIdentifiers, etc.)
* Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
*/
public String toString() {
String raw = valueAfterMD5.toUpperCase();
StringBuffer sb = new StringBuffer(64);
sb.append(raw.substring(0, 8));
sb.append("-");
sb.append(raw.substring(8, 12));
sb.append("-");
sb.append(raw.substring(12, 16));
sb.append("-");
sb.append(raw.substring(16, 20));
sb.append("-");
sb.append(raw.substring(20));
return sb.toString();
}
// Demonstraton and self test of class
public static void main(String args[]) {
for (int i=0; i< 100; i++) {
RandomGUID myGUID = new RandomGUID();
System.out.println("Seeding String=" + myGUID.valueBeforeMD5);
System.out.println("rawGUID=" + myGUID.valueAfterMD5);
System.out.println("RandomGUID=" + myGUID.toString());
}
}
}
四:UUID在使用二
可以采用一个开源实现:http://jug.safehaus.org/ 或者用jakarta commons下的http://jakarta.apache.org/commons/sandbox/id/
五:UUID在使用三
在Java1.5中,已经包含了一个UUID的实现java.util.UUID。要随机生成一个UUID,只要用两行代码就可以了:String uuid = UUID.randomUUID().toString(); 目前UUID类只提供了根据md5和根据随机数来构建uuid的算法(即第3和第4个版本的算法)。
相关推荐
本文将详细介绍Math.uuid.js脚本中的三种UUID生成方法:`Math.uuid()`, `Math.uuidFast()`, 和 `Math.uuidCompact()`。 #### 二、UUID的概念与标准 UUID是一种128位的数字标识符,通常表示为32个十六进制数字,以...
本文将详细介绍如何在Linux系统(以CentOS为例)中使用UUID来挂载数据盘,从而避免由于磁盘标识符(如sda、sdb等)的变化而导致挂载失败的问题。 #### 二、准备工作 1. **订购并登录服务器**:首先,需要订购一台...
类似于`uuid3()`,`uuid5()`也是基于命名空间和名称生成UUID,但这里使用的是SHA-1哈希算法。这也提供了命名空间内的唯一标识,但比MD5更安全。 在Python中,我们可以这样使用这些方法: ```python import uuid ...
8. 文档或README:可能包含项目介绍、使用说明、安装步骤等信息。 在实际使用中,开发人员可以将"uuid32.dll"作为依赖库引入到他们的项目中,通过调用导出的函数(如`GenerateUUID()`)来获取UUID。这在数据库记录...
VMware Linux 虚拟机在使用 UDEV 无法获取共享存储磁盘的 UUID,这可能会导致一些问题,例如无法识别磁盘、无法挂载磁盘等。 解决方案 解决该问题有多种方法,下面将详细介绍其中的两种方法。 方法一:修改虚拟机...
本文将详细介绍如何在Impala中创建一个用户自定义函数(User Defined Function, UDF),用于生成不带连字符的UUID。 #### 二、环境准备与依赖配置 为了创建和使用Impala中的UDF,我们需要准备相应的开发环境,并...
- 在C语言中,实现UUID通常需要调用特定的库函数,例如在Windows系统中,可以使用`UuidCreate` API来生成UUID。 - `uuid.c`可能包含一个C语言的实现,它可能包含了UUID的生成、解析和比较等操作的函数定义。 - ...
下面将详细介绍如何在Cocos Creator中刷新文件夹内所有资源的UUID以及相关知识点。 1. **资源管理基础** - 在Cocos Creator中,资源是项目的核心组成部分,包括图片、音频、场景、精灵、脚本等。每个资源都有一个...
#### 二、Base64 编码与 UUID ##### 2.1 Base64 编码简介 Base64 编码是一种常用的二进制到文本的编码方式,它能将二进制数据转换为 ASCII 字符串,常用于电子邮件、网页和其他需要将二进制数据以文本形式传输或...
#### 一、UUID 的概念与作用 UUID (Universally Unique Identifier) 即全球唯一标识符,是一种在分布式网络环境中创建唯一标识符的标准方式。在iOS开发中,UUID常用于设备识别,例如跟踪用户行为、设备统计、推送...
使用UUID查询模型与使用自增ID类似,只需将`whereId`替换为`whereUuid`。例如,`Model::whereUuid($uuid)->first()`。 6. **注意事项** - **索引优化**:由于UUID长度固定,可以创建覆盖索引来优化查询性能。 - ...
通过以上介绍,我们可以看到 Java 中 UUID 的生成方式非常多样,既可以使用内置的 `java.util.UUID` 类,也可以通过自定义类实现更加灵活的 UUID 生成机制。对于特定的应用场景,例如需要基于 MAC 地址和时间戳生成 ...
本文将详细介绍如何在App运行时动态获取描述文件的UUID,以及如何引入SDK并使用.a静态库。 首先,我们需要理解描述文件(Profile)在iOS中的作用。描述文件是Apple为开发者提供的一个工具,它包含了用于验证应用的...
可以使用`SSKeychain`将`identifierForVendor`生成的UUID保存起来,然后在需要时读取,这样即使用户卸载再重装应用,仍然能识别到是同一设备。 总结,`SSKeychain`是iOS开发中安全管理用户数据的有效工具,结合UUID...
SN、SLP和UUID是与电脑硬件和安全性相关的要素,因此手册可能讲解如何使用工具来查看或更改这些设置,以及它们在设备管理和安全策略中的作用。 【标签解析】 "SN UUID"标签进一步强调了手册的核心内容,即序列号和...
下面我们将详细介绍如何在Rust项目中使用`uuid`库进行UUID的操作。 首先,你需要在你的`Cargo.toml`文件中添加`uuid`库作为依赖项: ```toml [dependencies] uuid = { version = "0.8", features = ["v4"] } ``` ...
本文将详细介绍uuid模块的使用方法,包括不同类型的UUID生成方式、如何生成符合RFC 4122标准的UUID,以及如何在实际应用中使用这些UUID。 Python的uuid模块为生成和管理唯一标识符提供了强大的支持。通过本文的介绍...
查看磁盘UUID的方法有多种,下面将介绍两种常见的方法: 一、通过查看/dev/disk/by-uuid/目录下的软连接确定磁盘UUID 在麒麟系统中,我们可以通过查看/dev/disk/by-uuid/目录下的软连接来确定磁盘的UUID。使用命令...
RFC 4122定义了最广泛使用的UUID类型。复制UUID的可能性接近于零,因此它们是在分布式系统中生成唯一标识符的理想选择。 UUID也可以以16字节的字符串形式以二进制格式存储。 通常,默认情况下会启用JSON扩展名,但...