java GUID生成器 产生随机GUID的方法
package test; import java.net.*; import java.util.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; /** * <p>描述: GUID生成器,参考了来自www.JavaExchange.com的RandomGUID</p> */ public class GuidGenerator extends Object { private static Random myRand; //基本java随机对象 private static SecureRandom mySecureRand; //安全随机对象 private static String s_id; //ip地址字符串 static { mySecureRand = new SecureRandom(); //用安全随机对象产生一随机数并用该随机数初始化基本java随机对象 long secureInitializer = mySecureRand.nextLong(); myRand = new Random(secureInitializer); try { //获得当前主机的ip地址字符串 s_id = InetAddress.getLocalHost().toString(); } catch (UnknownHostException e) { e.printStackTrace(); } } /** * 缺省构造器 */ public GuidGenerator() { } /** * 缺省的产生随机GUID的方法 * @return 正确返回32字节的字符串,错误则返回长度为零的字符串 */ public static String genRandomGUID() { return genRandomGUID(false); } /** * 产生随机GUID的方法,考虑产生GUID的效率,将来可以应用设计模式,先生成一堆id并缓存 * @param secure true : 带安全选项,用安全随机数对象生成 * false : 不带安全选项,用基本随机数对象生成 * @return 正确返回32字节的字符串,错误则返回长度为零的字符串 */ public static String genRandomGUID(boolean secure) { String valueBeforeMD5 = ""; //消息消化对象消化前的字符串 String valueAfterMD5 = ""; //经消息消化对象消化后的GUID字符串 MessageDigest md5 = null; //消息消化对象 StringBuffer sbValueBeforeMD5 = new StringBuffer(); try { md5 = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { System.out.println("Error: " + e); return valueBeforeMD5; } long time = System.currentTimeMillis(); //获得系统时间 long rand = 0; //随机数 if (secure) //用安全随机对象获得随机数 { rand = mySecureRand.nextLong(); } else //用基本随机对象获得随机数 { rand = myRand.nextLong(); } //拼接组成GUID的各个信息 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(); //消息消化对象进行消化动作,返回128bit String strTemp = ""; for (int i = 0; i < array.length; i++) { strTemp = (Integer.toHexString(array[i] & 0XFF)); if (strTemp.length() == 1) { valueAfterMD5 = valueAfterMD5 + "0" + strTemp; } else { valueAfterMD5 = valueAfterMD5 + strTemp; } } //GUID标准格式如:C2FEEEAC-CFCD-11D1-8B05-00600806D9B6 return valueAfterMD5.toUpperCase(); } public static void main(String args[]) { for (int i = 1; i < 10; i++) { System.out.println(Integer.toString(i) + " : " + genRandomGUID()); } } }
运行结果
1 : BDE4A953342C1B44CF186E6CA30E54FC 2 : C21659FA319D0AECBC5F56BF07055B12 3 : 9B0FE8CC5EB5E5E509BAF50730A163AF 4 : 674CAEF13B787AB1105AB15A5F6B0162 5 : 38D4D67BA67301703D347C13D92B80CF 6 : A66305848E697DB9F65F906ECF9A4E9F 7 : F4317957D5A38FAC6220D77D49EF408C 8 : 33CF7899B1DEA3E124935FC8312A3B6C 9 : C87E0C364F4FEF7B84519C2C3AE2322D