packagecom.utils;/*@authorAdministrator
*
* TODO To change the template for this generated type comment go to
* Window – Preferences – Java – Code Style – Code Templates*/
importjava.net.InetAddress;importjava.net.UnknownHostException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.security.SecureRandom;importjava.util.Random;public class RandomGUID extendsObject {protected final org.apache.commons.logging.Log logger =org.apache.commons.logging.LogFactory
.getLog(getClass());public String valueBeforeMD5 = “”;public String valueAfterMD5 = “”;private staticRandom myRand;private staticSecureRandom mySecureRand;private staticString 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= newSecureRandom();long secureInitializer =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.*/
public RandomGUID(booleansecure) {
getRandomGUID(secure);
}/ Method to generate the random GUID*/
private void getRandomGUID(booleansecure) {
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
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-00D9B6*/
publicString 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));returnsb.toString();
}//Demonstraton and self test of class
public static voidmain(String args[]) {for (int i=0; i< 1; i++) {
RandomGUID myGUID= newRandomGUID();
System.out.println(“Seeding String:\t” +myGUID.valueBeforeMD5);
System.out.println(“rawGUID:\t” +myGUID.valueAfterMD5);
System.out.println(“RandomGUID:\t” +myGUID.toString());
}
}
}
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/209855.html原文链接:https://javaforall.net
