packageutils;importjava.net.InetAddress;importjava.net.UnknownHostException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjava.util.Random;publicclassRandomGUIDextendsObject {protectedfinalorg.apache.commons.logging.Log logger=org.apache.commons.logging.LogFactory
.getLog(getClass());publicString valueBeforeMD5="";publicString valueAfterMD5="";privatestaticRandom myRand;privatestaticSecureRandom mySecureRand;privatestaticString s_id;privatestaticfinalintPAD_BELOW=0x10;privatestaticfinalintTWO_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=newSecureRandom();longsecureInitializer=mySecureRand.nextLong();
myRand=newRandom(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.*/publicRandomGUID() {
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.*/publicRandomGUID(booleansecure) {
getRandomGUID(secure);
}/** Method to generate the random GUID*/privatevoidgetRandomGUID(booleansecure) {
MessageDigest md5=null;
StringBuffer sbValueBeforeMD5=newStringBuffer(128);try{
md5=MessageDigest.getInstance("MD5");
}catch(NoSuchAlgorithmException e) {
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();
StringBuffer sb=newStringBuffer(32);for(intj=0; j
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*/publicString toString() {
String raw=valueAfterMD5.toUpperCase();
StringBuffer sb=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();
}//Demonstraton and self test of classpublicstaticvoidmain(String args[]) {for(inti=0; i<100; i++) {
RandomGUID myGUID=newRandomGUID();
System.out.println("Seeding String="+myGUID.valueBeforeMD5);
System.out.println("rawGUID="+myGUID.valueAfterMD5);
System.out.println("RandomGUID="+myGUID.toString());
}
}
}