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
经验分享 程序员 微信小程序 职场和发展