`
kong_bai
  • 浏览: 136457 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

怎样用java生成GUID与UUID

阅读更多
   GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复。

    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID
import java.util.UUID;
public class Test {
 public static void main(String[] args) {
  UUID uuid = UUID.randomUUID(); 
  System.out.println (uuid);
}
}
编译运行输出:
07ca3dec-b674-41d0-af9e-9c37583b08bb


两种方式生成guid 与uuid

需要comm log 库

/**
 * @author Administrator
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;

public class RandomGUID extends Object {
   protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
      .getLog(getClass());

   public String valueBeforeMD5 = "";
   public String valueAfterMD5 = "";
   private static Random myRand;
   private static SecureRandom mySecureRand;

   private static String 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 = 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 RandomGUID() {
      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(boolean secure) {
      getRandomGUID(secure);
   }

   /*
    * Method to generate the random GUID
    */
   private void getRandomGUID(boolean secure) {
      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 < PAD_BELOW)
               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
    */
   public String 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));

      return sb.toString();
   }


     // Demonstraton and self test of class
     public static void main(String args[]) {
       for (int i=0; i< 100; i++) {
         RandomGUID myGUID = new RandomGUID();
         System.out.println("Seeding String=" + myGUID.valueBeforeMD5);
         System.out.println("rawGUID=" + myGUID.valueAfterMD5);
         System.out.println("RandomGUID=" + myGUID.toString());
       }
     }


}


同样

UUID uuid = UUID.randomUUID();
System.out.println("{"+uuid.toString()+"}");


UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。
分享到:
评论
2 楼 azhqiang 2010-10-28  
第一个方法,我是jdk1.6的,提示没有randomUUID()这个方法,这是怎么回事呢。
1 楼 owl520_je 2009-07-31  
真强悍,很多的时候需要一个唯一标识,guid应该时最佳的选择了!

相关推荐

    GUID代码生成与算法介绍

    GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。生成算法用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

    JAVA UUID 生成全球唯一ID

    GUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成GUID。从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义上)3240年不重复

    Java的 GUID 类 型

    大家都知道.NET中有GUID 这个类型,保证每次生成的编号唯一,一般用来作为数据库的主键列使用。 Java里也有这个类型,他位于java.util中 是一个静态类UUID。 具体使用方法,详见附件下载。

    JavaUUIDGenerator.zip

    JUG 是一个纯 Java 的 UUID 生成器。UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成UUID的API。UUID按照开放软件基金会 (OSF)制定的标准计算,用到了以太网卡地址...

    uuid工具工具

    java图形化操作,点击生成全球唯一的uuid

    guidplugin:用于生成随机 UUID 字符串的 IntelliJ IDEA 插件

    随机 UUID 生成器。 这是一个简单的插件,可将随机 UUID 字符串插入到您的文档中。 用法:键入 control-alt-U、control-alt-R(在 OS X 上是命令,而不是控制)。 受到这个启发。

    ulid-creator:一个用于生成ULID的Java库

    可以存储为UUID / GUID; 可以存储为26个字符的字符串; 可以存储为16个字节的数组; 字符串格式编码为 ; 字符串格式是URL安全且不区分大小写的。 如何使用 创建一个ULID: Ulid ulid = UlidCreator . ...

    Android10获取唯一ID最佳做法

    最简单的方式是使用以下代码生成您自己的 GUID。  1.Kotlin写法 var uniqueID = UUID.randomUUID().toString() 2.Java写法 String uniqueID = UUID.randomUUID().toString(); 2. 使用硬件信息拼接生成一个ID ...

    JrebelBrainsLicenseServerforJava:自建JRebel许可服务器用到的原始

    JrebelBrainsLicenseServerforJava 自建JRebel许可证服务器 ...访问地址: guid可以使用UUID直接生成,或者使用 破解补丁破解IDEA 补丁地址 使用方法 将补丁放在安装包的/ bin路径下; 分别对本文件夹(bin)下的idea.

    从J2SE到J2EE知识点介绍

    (七) ID的生成策略 215 1. increment 216 2. identity 216 3. sequence 216 4. hilo 217 5. seqhilo 217 6. uuid 217 7. guid 217 8. native 217 9. assigned 217 10. select 217 11. foreign 218 (八) 复合自然主键...

Global site tag (gtag.js) - Google Analytics