zoukankan      html  css  js  c++  java
  • Java 生成 UUID

    1.UUID 简介

         UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OSF) 的组织应用在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部分。

         UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。如此一来,每个人都可以建立不与其它人冲突的 UUID。 在这样的情况下,就不需考虑数据库建立时的名称重复问题。目前最广泛应用的 UUID,即是微软的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的应用, 则有 Linux ext2/ext3 档案系统、LUKS 加密分割区、GNOME、KDE、Mac OS X 等等

    2.UUID 组成

        UUID保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成的API。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字 UUID由以下几部分的组合: (1)当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同。 (2)时钟序列。 (3)全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。 UUID的唯一缺陷在于生成的结果串会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函数很简单地生成UUID, 其格式为:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。而标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12);

    3.项目实战

        UUID 来作为数据库数据表主键是非常不错的选择,保证每次生成的UUID 是唯一的。
    a.生成 UUID 需要用到java 自带 JDk;

    复制代码
    import java.util.UUID;
    public static void main(String[] args) {
    for(int i=0;i<10;i++){
    String uuid = UUID.randomUUID().toString().replaceAll("-", "");
    System.out.println(uuid);
    }
    }
    复制代码

    b.生成指定数目的 UUID

    复制代码
    /** 
    * 获得指定数目的UUID 
    * @param number int 需要获得的UUID数量 
    * @return String[] UUID数组 
    */ 
    public static String[] getUUID(int number){ 
    if(number < 1){ 
    return null; 
    } 
    String[] retArray = new String[number]; 
    for(int i=0;i<number;i++){ 
    retArray[i] = getUUID(); 
    } 
    return retArray; 
    }
    
    /** 
    * 获得一个UUID 
    * @return String UUID 
    */ 
    public static String getUUID(){ 
    String uuid = UUID.randomUUID().toString(); 
    //去掉“-”符号 
    return uuid.replaceAll("-", "");
    }
    复制代码

    短8位UUID思想其实借鉴微博短域名的生成方式,但是其重复概率过高,而且每次生成4个,需要随即选取一个。

    本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62操作,结果作为索引取出字符,

    这样重复率大大降低。

    经测试,在生成一千万个数据也没有出现重复,完全满足大部分需求。

    代码贴出来供大家参考。

    1. public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",  
    2.             "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",  
    3.             "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",  
    4.             "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",  
    5.             "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",  
    6.             "W", "X", "Y", "Z" };  
    7.   
    8.   
    9. public static String generateShortUuid() {  
    10.     StringBuffer shortBuffer = new StringBuffer();  
    11.     String uuid = UUID.randomUUID().toString().replace("-", "");  
    12.     for (int i = 0; i < 8; i++) {  
    13.         String str = uuid.substring(i * 4, i * 4 + 4);  
    14.         int x = Integer.parseInt(str, 16);  
    15.         shortBuffer.append(chars[x % 0x3E]);  
    16.     }  
    17.     return shortBuffer.toString();  
    18.   
    19. }  
    public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
    			"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
    			"t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
    			"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
    			"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
    			"W", "X", "Y", "Z" };
    
    
    public static String generateShortUuid() {
    	StringBuffer shortBuffer = new StringBuffer();
    	String uuid = UUID.randomUUID().toString().replace("-", "");
    	for (int i = 0; i < 8; i++) {
    		String str = uuid.substring(i * 4, i * 4 + 4);
    		int x = Integer.parseInt(str, 16);
    		shortBuffer.append(chars[x % 0x3E]);
    	}
    	return shortBuffer.toString();
    
    }
  • 相关阅读:
    eslint 验证vue文件 报错 unexpected token =解决方法
    启动3ds Max报 d3dx9_43.dll丢失 解决方法
    windows下webpack不是内部命令 解决方法
    修改node.js默认的npm安装目录
    tp5 重定向缺少index.php报错(No input file specified)
    PHP单表操作mysqli数据库类的封装
    php 常见图片处理函数封装
    php图像处理函数image_type_to_extension、image_type_to_mime_type 的区别
    kubernetes集群部署mysql 8.0
    Maven ResourceBundle.getBundle读取Properties异常MissingResourceException: Can't find bundlei解决方法
  • 原文地址:https://www.cnblogs.com/firstdream/p/7975783.html
Copyright © 2011-2022 走看看