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底层也懒得研究)

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

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

相关推荐
潲爺1 天前
Java IDEA学习之路:第九周课程笔记归纳
java·学习·intellij-idea
化作星辰1 天前
java 给鉴权kafka2.7(sasl)发送消息权限异常处理
java·大数据·开发语言·kafka
user_admin_god1 天前
企业级管理系统的站内信怎么轻量级优雅实现
java·大数据·数据库·spring boot
q***82911 天前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback
Kuo-Teng1 天前
LeetCode 206: Reverse Linked List
java·算法·leetcode·职场和发展
yaoxin5211231 天前
237. Java 集合 - 对 List 元素进行排序
java·windows
yaoxin5211231 天前
236. Java 集合 - 使用索引访问 List 元素
java·windows·list
humors2211 天前
服务端开发案例(不定期更新)
java·数据库·后端·mysql·mybatis·excel
百***68041 天前
JavaWeb项目打包、部署至Tomcat并启动的全程指南(图文详解)
java·tomcat
庸子1 天前
Kubernetes调度器深度解析:从资源分配到亲和性策略的架构师之路
java·算法·云原生·贪心算法·kubernetes·devops