Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          使用Java生成GUID的類(轉)

           

          GUID是一個128位長的數字,一般用16進制表示。算法的核心思想是結合機器的網卡、當地時間、一個隨即數來生成GUID。從理論上講,如果一臺機器每秒產生10000000個GUID,則可以保證(概率意義上)3240年不重復。

          import java.net.*;
          import java.util.*;
          import java.security.*;public class GuidCreator extends Object {

          private String seedingString = “”;
          private String rawGUID = “”;
          private boolean bSecure = false;
          private static Random myRand;
          private static SecureRandom mySecureRand;

          private static String s_id;

          public static final int BeforeMD5 = 1;
          public static final int AfterMD5 = 2;
          public static final int FormatString = 3;

          static {
          mySecureRand = new SecureRandom();
          long secureInitializer = mySecureRand.nextLong();
          myRand = new Random(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.
          */
          public GuidCreator() { }

          /*
          * 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 GuidCreator(boolean secure) {
          bSecure = secure;
          }

          /*
          * Method to generate the random GUID
          */
          private void getRandomGUID(boolean secure) {
          MessageDigest md5 = null;
          StringBuffer sbValueBeforeMD5 = new StringBuffer();

          try {
          md5 = MessageDigest.getInstance(”MD5″);
          } catch (NoSuchAlgorithmException e) {
          System.out.println(”Error: ” + e);
          }

          try {
          long time = System.currentTimeMillis();
          long rand = 0;

          if (secure) {
          rand = mySecureRand.nextLong();
          } else {
          rand = myRand.nextLong();
          }

          // This StringBuffer can be a long as you need; the MD5
          // hash will always return 128 bits. You can change
          // the seed to include anything you want here.
          // You could even stream a file through the MD5 making
          // the odds of guessing it at least as great as that
          // of guessing the contents of the file!
          sbValueBeforeMD5.append(s_id);
          sbValueBeforeMD5.append(”:”);
          sbValueBeforeMD5.append(Long.toString(time));
          sbValueBeforeMD5.append(”:”);
          sbValueBeforeMD5.append(Long.toString(rand));

          seedingString = sbValueBeforeMD5.toString();
          md5.update(seedingString.getBytes());

          byte[] array = md5.digest();
          StringBuffer sb = new StringBuffer();
          for (int j = 0; j < array.length; ++j) {
          int b = array[j] & 0xFF;
          if (b < 0×10) sb.append(’0′);
          sb.append(Integer.toHexString(b));
          }

          rawGUID = sb.toString();

          } catch (Exception e) {
          System.out.println(”Error:” + e);
          }
          }

          public String createNewGuid(int nFormatType, boolean secure) {
          getRandomGUID(secure);
          String sGuid = “”;
          if (BeforeMD5 == nFormatType) {
          sGuid = this.seedingString;
          } else if (AfterMD5 == nFormatType) {
          sGuid = this.rawGUID;
          } else {
          sGuid = this.toString();
          }
          return sGuid;
          }

          public String createNewGuid(int nFormatType) {
          return this.createNewGuid(nFormatType, this.bSecure);
          }

          /*
          * Convert to the standard format for GUID
          * (Useful for SQL Server UniqueIdentifiers, etc.)
          * Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
          */
          public String toString() {
          String raw = rawGUID.toUpperCase();
          StringBuffer sb = new StringBuffer();
          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));

          return sb.toString();
          }
          }

          /**
          * Use Exceple
          * public static void main(String args[]) {
          * for (int i=0; i< 100; i++) {
          * GuidCreator myGUID = new GuidCreator();
          * System.out.println(”Seeding String=” + myGUID.getNewGuid(GuidCreator.BeforeMD5));
          * System.out.println(”rawGUID=” + myGUID.getNewGuid(GuidCreator.AfterMD5));
          * System.out.println(”RandomGUID=” + myGUID.getNewGuid(GuidCreator.FormatString));
          * }
          * }
          */

          本方源于互聯網,但已經過作者自己的修改,更易于使用

          posted on 2007-11-17 23:31 都市淘沙者 閱讀(7220) 評論(3)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

          評論

          # re: 使用Java生成GUID的類(轉) 2010-07-24 10:43 旺才

          也不知道博主有沒有測試,“if (b < 0×10) sb.append(’0′);” 中的“×”應該是什么符號呢?編譯通不過  回復  更多評論   

          # re: 使用Java生成GUID的類(轉)[未登錄] 2010-11-04 16:05 jacky

          @旺才
          if(b<0x10) 這個表示16進制的10

          樓主的代碼中有不少錯誤,一些引號和單引號都是全角的  回復  更多評論   

          # re: 使用Java生成GUID的類(轉)[未登錄] 2010-12-15 14:02 zy

          樓主是抄來的了!uuid飄過。。。  回復  更多評論   

          主站蜘蛛池模板: 罗江县| 洱源县| 天长市| 鹤壁市| 界首市| 河池市| 册亨县| 宜宾县| 宁阳县| 叶城县| 宁明县| 定远县| 出国| 崇州市| 沙洋县| 五台县| 织金县| 无棣县| 新闻| 东平县| 九龙县| 无极县| 吉林市| 岳阳市| 西昌市| 格尔木市| 淳安县| 钟祥市| 汨罗市| 兴宁市| 百色市| 津市市| 驻马店市| 林周县| 黔江区| 阳新县| 来安县| 香港 | 怀来县| 八宿县| 三台县|