Java UUID的生成,不重复

简介: uuid的生成方式有很多,这里是一个尽可能的生成不重复的uuid.

uuid的生成方式有很多,这里是一个尽可能的生成不重复的uuid.

import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.locks.ReentrantLock;

public class UUIDUtils {
    public static void main(String[] args) {
        System.out.println(UUIDUtils.create().toString().replaceAll("-", ""));
        System.out.println(UUIDUtils.random().toString().replaceAll("-", ""));
    }

    private static boolean IS_THREADLOCALRANDOM_AVAILABLE = false;  
    private static Random random;  
    private static final long   leastSigBits;  
    private static final ReentrantLock lock = new ReentrantLock();  
    private static long lastTime;  
  
    static {  
        try {  
            IS_THREADLOCALRANDOM_AVAILABLE = null != UUIDUtils.class.getClassLoader().loadClass(  
                    "java.util.concurrent.ThreadLocalRandom"  
            );  
        } catch(ClassNotFoundException e) {  
        }  
  
        byte[] seed = new SecureRandom().generateSeed(8);  
        leastSigBits = new BigInteger(seed).longValue();  
        if(!IS_THREADLOCALRANDOM_AVAILABLE) {  
            random = new Random(leastSigBits);  
        }  
    }  
  
    private UUIDUtils() {  
    }  
  
    /** 
     * Create a new random UUID. 
     * 
     * @return the new UUID 
     */  
    public static UUID random() {  
        byte[] randomBytes = new byte[16];  
        if(IS_THREADLOCALRANDOM_AVAILABLE) {  
            java.util.concurrent.ThreadLocalRandom.current().nextBytes(randomBytes);  
        } else {  
            random.nextBytes(randomBytes);  
        }  
  
        long mostSigBits = 0;  
        for(int i = 0; i < 8; i++) {  
            mostSigBits = (mostSigBits << 8) | (randomBytes[i] & 0xff);  
        }  
        long leastSigBits = 0;  
        for(int i = 8; i < 16; i++) {  
            leastSigBits = (leastSigBits << 8) | (randomBytes[i] & 0xff);  
        }  
  
        return new UUID(mostSigBits, leastSigBits);  
    }  
  
    /** 
     * Create a new time-based UUID. 
     * 
     * @return the new UUID 
     */  
    public static UUID create() {
        long timeMillis = (System.currentTimeMillis() * 10000) + 0x01B21DD213814000L;
  
        lock.lock();  
        try {  
            if(timeMillis > lastTime) {  
                lastTime = timeMillis;  
            } else {  
                timeMillis = ++lastTime;  
            }  
        } finally {  
            lock.unlock();  
        }  
  
        // time low  
        long mostSigBits = timeMillis << 32;  
  
        // time mid  
        mostSigBits |= (timeMillis & 0xFFFF00000000L) >> 16;  
  
        // time hi and version  
        mostSigBits |= 0x1000 | ((timeMillis >> 48) & 0x0FFF); // version 1  
  
        return new UUID(mostSigBits, leastSigBits);  
    }
}

额外记录一个set转换的工具:


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class SetUtil {

    public static void main(String[] args) {
        String str = "";
        System.out.println(stringToSet(str));
        System.out.println(stringToList(str));
    }
    
    public static Set<String> stringToSet(String str) {
        String[] strs = str.split(",");
        Set<String> set = new HashSet<>();
        Collections.addAll(set, strs);
        return set;
    }

    public static List<String> stringToList(String str) {
        List<String> list = new ArrayList<>();
        Collections.addAll(list, str.split(","));
        return list;
    }

    public static String setToString(Set<String> set) {
        return String.join(",", set);
    }

    public static void arrayToSet() {
        Character[] chars = { '1', '2', '3', '4' };
        Set<Character> set = new HashSet<>();
        Collections.addAll(set, chars);
    }

    public static String[] setToArray() {
        Set<Character> set = new HashSet<>();
        String[] strs = set.toArray(new String[set.size()]);
        return strs;
    }
}
相关文章
|
分布式计算 Java Linux
Java 生成 UUID
Java 生成 UUID
10344 1
|
6月前
|
安全 Java
UUID太长怎么办?快来试试NanoId(Java版本)
UUID太长怎么办?快来试试NanoId(Java版本)
274 5
|
7月前
|
存储 Java
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
35、Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
104 0
|
分布式计算 安全 算法
Java基础:UUID
作为开发人员大家对UUID应该都比较熟悉了,Java中也提供了相关的类和生成方法,供业务中使用。这里准备对UUID生成的过程做一次深入了解。
268 0
|
存储 安全 Java
Java类库StrringBuffer类、Math、SimpleDateFormat、Random随机数、大数字处理类和UUID 无重复数据(附带面试题)
1.StrringBuffer类 CharConsequnse接口,2.Math数学计算,3.Date日期处理类与SimpleDateFormat、4.Random随机数、5.大数字处理类、6.UUID 无重复数据
111 0
|
Java
Java的UUID简单生成方法
java的uuid简单生成
236 0
|
Java 数据库 数据安全/隐私保护
java中使用uuid(2)-处理数据库逻辑
当我们在建立数据库表的时候,需要有一定的规范,例如:每个表中都有一个自增的主键;密码不可以用明文,需要加密;有的字段不可为NULL;那么,有一个自我唯一标识的字段是必不可少的。但是毕竟不是所有业务都会有身份证标识,所以uuid是比较通用的一个技术。在数据库表中,需要生成一个唯一 ID 来标识字段的唯一性,所以就引入了uuid。答:现实中肯定有重名的人,不符合。可以看到,user_uuid是互相对应的,是一个唯一标识。如果以后要做一些业务的话,用uuid去做会比较好。2.那么,我们用身份证可以吗?
254 0
java中使用uuid(2)-处理数据库逻辑
|
算法 Java 数据库
如何在java中使用uuid(1)-随机uuid的获取
UUID是国际标准化组织ISO提出的一个概念。UUID是一个128比特的数值,这个数值可以通过一定的算法计算出来。为了提高效率,常用的UUID可缩短至16位。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。一般来说,可以保证这个值是真正唯一的任何地方产生的任意一个UUID都不会有相同的值。使用UUID的一个好处是可以为新的服务创建新的标识符。
419 0
如何在java中使用uuid(1)-随机uuid的获取
|
存储 Java
第35篇:Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
✏️ java.lang.Math 类提供了常见的数学计算功能 ✏️ Math 类被 final 修饰(不能被继承) ✏️ Math 类不能被实例化
264 0
第35篇:Java 中的 Math 类、Random 随机数、UUID、格式化字符串或数字、字符串和数字的相互转换、高精度计算、BigDecimal、计算机中的浮点数都是近似值
java 获取uuid 获取ip 获取工具
java 获取uuid 获取ip 获取工具
下一篇
DataWorks