博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA UUID 生成
阅读量:6792 次
发布时间:2019-06-26

本文共 5609 字,大约阅读时间需要 18 分钟。

UUID介绍:

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

  UUID是1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID

  生成UUID的网站:

简单示例:

package com.test;import java.util.UUID;public class Test {    public static void main(String[] args) {        UUID uuid = UUID.randomUUID();        System.out.println(uuid);    }}

控制台输出结果:

概念详解:

  UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。

  按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。

  由以下几部分的组合:

    1.当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同)

    2.时钟序列

    3.全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得)

  UUID的唯一缺陷在于生成的结果串会比较长。

下面就是实现为数据库获取一个唯一的主键ID的代码:

package com.utils;import java.util.UUID;public class UUIDGenerator {    /**      * 获得一个去掉“-”符号的UUID      * @return String UUID      */     public static String getUUID(){         String s = UUID.randomUUID().toString();         //去掉“-”符号         return s.substring(0,8)+s.substring(9,13)+s.substring(14,18)+s.substring(19,23)+s.substring(24);     }        /**      * 获得指定数目去掉“-”符号的UUID      * @param number int 需要获得的UUID数量      * @return String[] UUID数组      */     public static String[] getUUID(int number){         if(number < 1){             return null;         }         String[] ss = new String[number];         for(int i=0;i

main方法输出结果:

GUID:

package com.utils;/** * @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< 1; i++) {         RandomGUID myGUID = new RandomGUID();         System.out.println("Seeding String:\t" + myGUID.valueBeforeMD5);         System.out.println("rawGUID:\t" + myGUID.valueAfterMD5);         System.out.println("RandomGUID:\t" + myGUID.toString());       }     }     }

main方法输出结果:

 参考自:

转载地址:http://jgago.baihongyu.com/

你可能感兴趣的文章
tablesorter 使用
查看>>
一种用手机号码定位机主的理论方法
查看>>
underscore源码解析1
查看>>
html5从0到1-html5的简易数据库开发(18)
查看>>
spring cloud gateway 全局过滤器
查看>>
RAP Mock 工具模拟数据
查看>>
Confluence 6 确定一个生产系统备份方案
查看>>
在Chrome浏览器中保存的密码有多安全?
查看>>
撩人情话(三)
查看>>
JetBrains Product Pack for Students
查看>>
内存顺序(Memory Order)
查看>>
shiro实战系列(一)之入门实战
查看>>
BGP-RR 路由反射器工作原理
查看>>
算法作业:求一个集合中所有子集元素之和
查看>>
Linux内核驱动之延时 【转】
查看>>
Portal的简单使用
查看>>
springmvc4环境简单搭建和定时任务
查看>>
分布式锁的实现方式——ACID数据库、缓存或者是zk
查看>>
机器人在水下的精彩生活:探索更神秘的海洋世界
查看>>
和我一起学CSLA.NET----创建业务对象3
查看>>