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

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

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

相关推荐
Ysx4 小时前
比"本地全绿"更可怕的坑:"交付了"不等于"生效了"
java·后端
2301_786756604 小时前
2026 JCR 秋季数据重载解读:影响因子为什么会变?附期刊影响力数据批量追踪方案
java·服务器·前端
用户7771298509124 小时前
代码的命名规范有哪些?
java
旋律4144 小时前
为什么需要命名规范?有哪些命名规范?
java
2301_786756604 小时前
中科院分区表停发后,期刊评价的技术逻辑:从期刊超越指数到多指标选刊方案
java·数据库·windows
Wx-bishekaifayuan4 小时前
springboot铜仁非遗之家76938-计算机课程设计、毕业设计
java·spring boot·后端·spring·django·课程设计·旅游
顽疲4 小时前
java vue springboot 养老系统源码详解:退住 care_out 审批结算与腾床事务实践
java·vue.js·spring boot·vue养老·springboot养老·java养老
geats人山人海4 小时前
java 7异常
android·java·开发语言
斯内普吖4 小时前
(开源)线上花店系统实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
日常筹谋记4 小时前
仓储监测无线化改造经验:明治无线组网方案与WL系列Master总站落地复盘
网络·网络协议