UUID转16字节数组(Java)

最近在写协议的时候,遇到需要将一个36字符长度的UUID转为长度为16的字节数组;

这样处理的话那我们就需要保证唯一性和可还原;

于是我使用了下面的方式:

java 复制代码
     /**
     * uuid转16字节数组
     *
     * @param uuidStr
     * @return
     */
    private static byte[] getBytesByUUID(String uuidStr) {
        UUID uuid = UUID.fromString(uuidStr);
        long mostSignificantBits = uuid.getMostSignificantBits();
        long leastSignificantBits = uuid.getLeastSignificantBits();
        ByteBuffer buffer = ByteBuffer.allocate(16);//开辟16个字节的空间
        buffer.putLong(mostSignificantBits);
        buffer.putLong(leastSignificantBits);
        return buffer.array();
    }

    /**
     * 方式2:原因是uuid的- 对唯一性没有影响
     *
     * @param uuidStr
     * @return
     */
    private static byte[] getBytesByUUIDOther(String uuidStr) {
        String replace = uuidStr.replace("-", "");
        byte[] bytes1 = HexUtils.fromHexString(replace);//16进制转字节数组
        return bytes1;
    }

还原:

java 复制代码
    /**
     * 16位bytes 转uuid
     * @param bytes
     * @return
     */
    public static String getUUIDStrByBytes(byte[] bytes) {
        ByteBuffer buffer = ByteBuffer.wrap(bytes);
        long most = buffer.getLong();
        long least = buffer.getLong();
        UUID uuid = new UUID(most, least);
        return uuid.toString();
    }

测试一下:

java 复制代码
    public static void main(String[] args) throws NoSuchAlgorithmException {

        byte[] bytes = getBytesByUUID("56ad1015-ac93-46dd-8712-9fc4d9ab0171");
        System.out.println("uuid 转 字节数组 " + Arrays.toString(bytes));

        byte[] uuidOther = getBytesByUUIDOther("56ad1015-ac93-46dd-8712-9fc4d9ab0171");
        System.out.println("uuid 转 字节数组 other= " + Arrays.toString(uuidOther));

        String uuidStr = getUUIDStrByBytes(bytes);
        System.out.println("16字节数组转 uuid = " + uuidStr);
    }
    }

结果:

可以还原已经证明了,怎么证明唯一性呢?

作证一

这个问题还有待探讨,写这个文章就是想集思广益,看看这个大模型的回答:

UUID是36位字符,而保证唯一的是除了- 的32字符(uuid是16进制hex 转bytes是16 byte也就是128位),

16进制hex转的bytes因为uuid唯一,所以这个字节数组也唯一;

对于高64位的值mostSigBits和低64位的值leastSigBits也就是唯一的了;(会发现两者的到的数组一样)

作证二

相信大家都知道uuid是唯一的那么,uuid判断唯一的方法一定可以作为依据;

从Java中util下的的UUID的源码来看:

它通过比较uuid的两个属性来确定两个uuid是否相同,

那么我对这两个属性进行转byte数组并组成一个16长度的bytes数组是不是也可以确定它的唯一性呢?(UUID底层也懒得研究)

或者大家有什么更好的方法来实现转换且能证明唯一性呢?

期待大佬们的补充。。。。

相关推荐
DynamicsAgg26 分钟前
企业数字化底座-k8s企业实践系列第二篇pod创建调度
java·容器·kubernetes
森林里的程序猿猿37 分钟前
并发设计模式
java·开发语言·jvm
222you1 小时前
四个主要的函数式接口
java·开发语言
Javatutouhouduan1 小时前
Java全栈面试进阶宝典:内容全面,题目高频!
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
SEO-狼术1 小时前
RAD Studio 13.1 Florence adds
java
ywf12151 小时前
Spring Boot接收参数的19种方式
java·spring boot·后端
敲代码的瓦龙2 小时前
Java?面向对象三大特性!!!
java·开发语言
架构师沉默2 小时前
AI 写的代码,你敢上线吗?
java·后端·架构
骑龙赶鸭2 小时前
java开发项目中遇到的难点,面试!
java·开发语言·面试