① 怎样用java生成GUID与UUID
两种方式生成guid与uuid
需要commlog库
/**
*@authorAdministrator
*
*
*Window-Preferences-Java-CodeStyle-CodeTemplates
*/
importjava.net.InetAddress;
importjava.net.UnknownHostException;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.security.SecureRandom;
importjava.util.Random;
{
protectedfinalorg.apache.commons.logging.Loglogger=org.apache.commons.logging.LogFactory
.getLog(getClass());
publicStringvalueBeforeMD5="";
publicStringvalueAfterMD5="";
privatestaticRandommyRand;
;
privatestaticStrings_id;
privatestaticfinalintPAD_BELOW=0x10;
privatestaticfinalintTWO_BYTES=0xFF;
/*
*.
*.Youmight
*
*itwitha"timesincefirstloaded"seedtorecethistime.
*.
*/
static{
mySecureRand=newSecureRandom();
longsecureInitializer=mySecureRand.nextLong();
myRand=newRandom(secureInitializer);
try{
s_id=InetAddress.getLocalHost().toString();
}catch(UnknownHostExceptione){
e.printStackTrace();
}
}
/*
*Defaultconstructor.,
*,highperformance.
*/
publicRandomGUID(){
getRandomGUID(false);
}
/*
*Constructorwithsecurityoption.Settingsecuretrue
*
*strong.
*.
*/
publicRandomGUID(booleansecure){
getRandomGUID(secure);
}
/*
*MethodtogeneratetherandomGUID
*/
privatevoidgetRandomGUID(booleansecure){
MessageDigestmd5=null;
StringBuffersbValueBeforeMD5=newStringBuffer(128);
try{
md5=MessageDigest.getInstance("MD5");
}catch(NoSuchAlgorithmExceptione){
logger.error("Error:"+e);
}
try{
longtime=System.currentTimeMillis();
longrand=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();
StringBuffersb=newStringBuffer(32);
for(intj=0;j<array.length;++j){
intb=array[j]&TWO_BYTES;
if(b<PAD_BELOW)
sb.append('0');
sb.append(Integer.toHexString(b));
}
valueAfterMD5=sb.toString();
}catch(Exceptione){
logger.error("Error:"+e);
}
}
/*
*
*(,etc.)
*Example:C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
*/
publicStringtoString(){
Stringraw=valueAfterMD5.toUpperCase();
StringBuffersb=newStringBuffer(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));
returnsb.toString();
}
//
publicstaticvoidmain(Stringargs[]){
for(inti=0;i<100;i++){
RandomGUIDmyGUID=newRandomGUID();
System.out.println("SeedingString="+myGUID.valueBeforeMD5);
System.out.println("rawGUID="+myGUID.valueAfterMD5);
System.out.println("RandomGUID="+myGUID.toString());
}
}
}
同样
UUIDuuid=UUID.randomUUID();
System.out.println("{"+uuid.toString()+"}");
UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(GlobalsUniqueIdentifiers)。
② java uuid 和guid 的区别
全局唯一标识符(GUID)是一种算法生成的二进制长度为128位的数字标识符。它常用于拥有多个节点、多台计算机的网络或系统中,以确保在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。GUID的总数达到了2^128(3.4×10^38)个,因此随机生成两个相同GUID的可能性非常小,但并不为0。为了减少这种重复的风险,用于生成GUID的算法通常都会加入非随机的参数,比如时间戳。
GUID这个词有时也专指微软对UUID标准的实现。UUID是由一组32位数的16进制数字组成的,理论上总数为16^32=2^128,约等于3.4 x 10^38。这意味着,即使每纳秒产生1兆个UUID,也需要大约100亿年才能用完所有的UUID。因此,GUID的唯一性非常高。
Java中的UUID与GUID相似,也是一种算法生成的128位数字标识符。Java的UUID类提供了多种方法来生成UUID,比如使用随机数生成器、基于时间戳等。与GUID一样,UUID的生成也依赖于非随机参数,以确保生成的UUID具有高度的唯一性。
在Java中,UUID可以用于各种场景,比如分布式系统中为对象分配全局唯一标识,或者在网络通信中作为消息标识符。通过使用非随机参数,Java UUID能够避免重复生成的问题,从而确保了其唯一性。
总结而言,Java UUID和GUID虽然都用于生成全局唯一标识符,但在实现细节上存在一些差异。GUID通常指微软实现的UUID标准,而Java UUID则是在Java平台上实现的UUID,两者都依赖于算法和非随机参数来确保唯一性。