`
zhanghw0917
  • 浏览: 185629 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

怎样用java生成GUID与UUID

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

    UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID
Java代码
import java.util.UUID;  
public class Test {  
public static void main(String[] args) {  
  UUID uuid = UUID.randomUUID();   
  System.out.println (uuid);  
}  


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 库

Java代码
/** 
* @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,);  
      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());  
       }  
     }  
 
 


/**
* @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,);
      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());
       }
     }


}

同样

Java代码
UUID uuid = UUID.randomUUID();  
System.out.println("{"+uuid.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)。

分享到:
评论
1 楼 wentao365 2011-11-18  
明明是 32位啊。怎么是128 位呢?

相关推荐

    java代码生成GUID

    标题中的"java代码生成GUID"指的是如何用Java编写代码来生成这样的唯一标识符,而描述中提到的"转换成标准的GUID码"是指将生成的UUID字符串格式化为常见的GUID格式,如"C2FEEEAC-CFCD-11D1-8B05-00600806D9B6"。...

    uuid生成16位的,唯一码

    uuid生成,可生成16个字符的唯一码。使用方法,见main函数

    如何生成guid

    Node.js环境中,可以使用`uuid`库生成GUID: ```javascript const uuid = require('uuid'); let guid = uuid.v4(); console.log(guid); ``` 3. **Python**: Python可以使用`uuid`模块生成GUID: ```python...

    JAVA UUID 生成全球唯一ID

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

    java生成UUID通用唯一识别码.docx

    Java中的UUID(Universally Unique Identifier)是一种用于生成全局唯一标识符的标准,由开源软件基金会(OSF)在分布式计算环境中提出。UUID的主要目的是确保在分布式系统中的任何元素都有其独特的识别信息,无需...

    Java的 GUID 类 型

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

    jdk1.4生成guid

    在Java中,通常使用`java.util.UUID`类来生成GUID。 在Java 1.4中,`UUID`类提供了生成GUID的方法。虽然现在的Java版本已经更新到8、11甚至17,但理解早期版本如何生成GUID仍然是有益的。`UUID`类包含两个主要的...

    Java 生成 UUID通用唯一标识符.docx

    在Java中,生成UUID最常用的方法是UUID.randomUUID(),它返回一个基于随机数生成的UUID实例。此外,UUID类还提供了其他构造方法,如使用long型的最高位和最低位生成UUID,或者通过字符串解析创建UUID对象。 UUID在...

    GUID代码生成与算法介绍

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

    mysql_guid主键生成方式范例

    在MySQL中,有几种方式可以生成GUID,包括`UUID()`函数和`BIN_TO_UUID()`函数。`UUID()`函数直接生成一个标准的UUID(即GUID),而`BIN_TO_UUID()`则用于将二进制形式的UUID转换为可读的字符串形式。 接下来,我们...

    基于Java生成GUID的实现方法

    在Java编程语言中,生成全局唯一标识符(GUID,Globally Unique Identifier)通常通过使用`java.util.UUID`类来实现。GUID是一个128位的数字,通常以16进制的形式展示,用于确保在分布式环境中的唯一性。由于其生成...

    全球唯一码生成器(GUID)

    在Java编程语言中,我们可以使用内置类`java.util.UUID`来生成GUID。`UUID`是通用唯一识别码(Universally Unique Identifier)的缩写,与GUID基本等价。`UUID`提供了多种生成方法,如`randomUUID()`,`...

    获取Guid唯一码

    在Swift中,可以使用`UUID`类型来生成Guid: ```swift let guid = UUID() ``` 7. Go语言: Go语言提供了`uuid`包,但需要额外安装。一旦安装,可以使用`New()`函数生成Guid: ```go import "github....

    UUID使用总结

    例如,在Java中,可以使用`java.util.UUID`类来生成和操作UUID;在Python中,可以导入`uuid`模块来实现相同功能。在实际应用中,UUID常用于数据库主键、临时文件命名、分布式系统中的唯一标识等场景,避免了命名冲突...

    Jmeter生成UUID作为唯一标识符过程图解

    这段代码使用 `UUID.randomUUID()` 方法生成一个随机的 UUID,然后使用 `toString()` 方法将其转换为字符串。接着,我们使用 `replaceAll()` 方法将连接符 (-) 去掉,并将结果存储在一个变量 `zichuan` 中。 如何在...

    JavaUUIDGenerator.zip

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

    UUID完全解析.txt

    1. **Java示例**:以下是一个简单的Java代码示例,展示了如何生成并打印一个UUID: ```java import java.util.UUID; public class Main { public static void main(String[] args) { UUID uuid = UUID....

    uuid 资料包

    在实际应用中,我们还可能遇到UUID的变体,如GUID(全局唯一标识符)在Windows系统中常见,它与UUID实际上是一致的,只是不同环境下的叫法。另外,对于隐私保护,一些现代系统倾向于使用Version 4 UUID,以避免包含...

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

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

    GUID批量生成器源码.e.rar

    1. **结构与原理**:GUID批量生成器的源码可能会包含一个核心算法,用于生成随机但唯一的128位数字。这个算法基于某种随机数生成器,可能结合了时间戳、硬件信息和其他随机因素,以确保全局唯一性。 2. **编程语言*...

Global site tag (gtag.js) - Google Analytics