开发者社区> 问答> 正文

将UUID存储为base64字符串

我一直在尝试使用UUID作为数据库密钥。我想占用尽可能少的字节,同时仍使UUID表示易于阅读。

我认为我已经使用base64将其压缩为22个字节,并删除了一些尾随的“ ==”,这对于我来说似乎是不必要存储的。这种方法有什么缺陷吗?

基本上,我的测试代码进行了大量转换,以将UUID转换为22字节的字符串,然后将其转换回UUID。

import java.io.IOException; import java.util.UUID;

public class UUIDTest {

public static void main(String[] args){
    UUID uuid = UUID.randomUUID();
    System.out.println("UUID String: " + uuid.toString());
    System.out.println("Number of Bytes: " + uuid.toString().getBytes().length);
    System.out.println();

    byte[] uuidArr = asByteArray(uuid);
    System.out.print("UUID Byte Array: ");
    for(byte b: uuidArr){
        System.out.print(b +" ");
    }
    System.out.println();
    System.out.println("Number of Bytes: " + uuidArr.length);
    System.out.println();


    try {
        // Convert a byte array to base64 string
        String s = new sun.misc.BASE64Encoder().encode(uuidArr);
        System.out.println("UUID Base64 String: " +s);
        System.out.println("Number of Bytes: " + s.getBytes().length);
        System.out.println();


        String trimmed = s.split("=")[0];
        System.out.println("UUID Base64 String Trimmed: " +trimmed);
        System.out.println("Number of Bytes: " + trimmed.getBytes().length);
        System.out.println();

        // Convert base64 string to a byte array
        byte[] backArr = new sun.misc.BASE64Decoder().decodeBuffer(trimmed);
        System.out.print("Back to UUID Byte Array: ");
        for(byte b: backArr){
            System.out.print(b +" ");
        }
        System.out.println();
        System.out.println("Number of Bytes: " + backArr.length);

        byte[] fixedArr = new byte[16];
        for(int i= 0; i<16; i++){
            fixedArr[i] = backArr[i];
        }
        System.out.println();
        System.out.print("Fixed UUID Byte Array: ");
        for(byte b: fixedArr){
            System.out.print(b +" ");
        }
        System.out.println();
        System.out.println("Number of Bytes: " + fixedArr.length);

        System.out.println();
        UUID newUUID = toUUID(fixedArr);
        System.out.println("UUID String: " + newUUID.toString());
        System.out.println("Number of Bytes: " + newUUID.toString().getBytes().length);
        System.out.println();

        System.out.println("Equal to Start UUID? "+newUUID.equals(uuid));
        if(!newUUID.equals(uuid)){
            System.exit(0);
        }


    } catch (IOException e) {
    }

}


public static byte[] asByteArray(UUID uuid) {

    long msb = uuid.getMostSignificantBits();
    long lsb = uuid.getLeastSignificantBits();
    byte[] buffer = new byte[16];

    for (int i = 0; i < 8; i++) {
        buffer[i] = (byte) (msb >>> 8 * (7 - i));
    }
    for (int i = 8; i < 16; i++) {
        buffer[i] = (byte) (lsb >>> 8 * (7 - i));
    }

    return buffer;

}

public static UUID toUUID(byte[] byteArray) {

    long msb = 0;
    long lsb = 0;
    for (int i = 0; i < 8; i++)
        msb = (msb << 8) | (byteArray[i] & 0xff);
    for (int i = 8; i < 16; i++)
        lsb = (lsb << 8) | (byteArray[i] & 0xff);
    UUID result = new UUID(msb, lsb);

    return result;
}

} 输出:

UUID String: cdaed56d-8712-414d-b346-01905d0026fe Number of Bytes: 36

UUID Byte Array: -51 -82 -43 109 -121 18 65 77 -77 70 1 -112 93 0 38 -2 Number of Bytes: 16

UUID Base64 String: za7VbYcSQU2zRgGQXQAm/g== Number of Bytes: 24

UUID Base64 String Trimmed: za7VbYcSQU2zRgGQXQAm/g Number of Bytes: 22

Back to UUID Byte Array: -51 -82 -43 109 -121 18 65 77 -77 70 1 -112 93 0 38 -2 0 38 Number of Bytes: 18

Fixed UUID Byte Array: -51 -82 -43 109 -121 18 65 77 -77 70 1 -112 93 0 38 -2 Number of Bytes: 16

UUID String: cdaed56d-8712-414d-b346-01905d0026fe Number of Bytes: 36

Equal to Start UUID? true 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 21:15:35 797 0
1 条回答
写回答
取消 提交回答
  • 我也在尝试做类似的事情。我正在使用使用以下形式的UUID 6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8(由Java中的标准UUID库生成)的Java应用程序。就我而言,我需要能够将此UUID减少到30个字符或更少。我使用了Base64,这些是我的便利功能。希望它们会对某人有所帮助,因为解决方案对我而言并不明显。

    用法:

    String uuid_str = "6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8"; String uuid_as_64 = uuidToBase64(uuid_str); System.out.println("as base64: "+uuid_as_64); System.out.println("as uuid: "+uuidFromBase64(uuid_as_64)); 输出:

    as base64: b8tRS7h4TJ2Vt43Dp85v2A as uuid : 6fcb514b-b878-4c9d-95b7-8dc3a7ce6fd8 功能:

    import org.apache.commons.codec.binary.Base64;

    private static String uuidToBase64(String str) { Base64 base64 = new Base64(); UUID uuid = UUID.fromString(str); ByteBuffer bb = ByteBuffer.wrap(new byte[16]); bb.putLong(uuid.getMostSignificantBits()); bb.putLong(uuid.getLeastSignificantBits()); return base64.encodeBase64URLSafeString(bb.array()); } private static String uuidFromBase64(String str) { Base64 base64 = new Base64(); byte[] bytes = base64.decodeBase64(str); ByteBuffer bb = ByteBuffer.wrap(bytes); UUID uuid = new UUID(bb.getLong(), bb.getLong()); return uuid.toString(); }

    2020-02-08 21:16:22
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载