Storing UUID as base64 String

后端 未结 8 1340
青春惊慌失措
青春惊慌失措 2020-11-29 16:14

I have been experimenting with using UUIDs as database keys. I want to take up the least amount of bytes as possible, while still keeping the UUID representation human read

相关标签:
8条回答
  • 2020-11-29 16:48

    You don't say what DBMS you're using, but it seems that RAW would be the best approach if you're concerned about saving space. You just need to remember to convert for all queries, or you'll risk a huge performance drop.

    But I have to ask: are bytes really that expensive where you live?

    0 讨论(0)
  • 2020-11-29 16:49

    Below is what I use for a UUID (Comb style). It includes code for converting a uuid string or uuid type to base64. I do it per 64 bits, so I don't deal with any equal signs:

    JAVA

    import java.util.Calendar;
    import java.util.UUID;
    import org.apache.commons.codec.binary.Base64;
    
    public class UUIDUtil{
        public static UUID combUUID(){
            private UUID srcUUID = UUID.randomUUID();
            private java.sql.Timestamp ts = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime());
    
            long upper16OfLowerUUID = this.zeroLower48BitsOfLong( srcUUID.getLeastSignificantBits() );
            long lower48Time = UUIDUtil.zeroUpper16BitsOfLong( ts );
            long lowerLongForNewUUID = upper16OfLowerUUID | lower48Time;
            return new UUID( srcUUID.getMostSignificantBits(), lowerLongForNewUUID );
        }   
        public static base64URLSafeOfUUIDObject( UUID uuid ){
            byte[] bytes = ByteBuffer.allocate(16).putLong(0, uuid.getLeastSignificantBits()).putLong(8, uuid.getMostSignificantBits()).array();
            return Base64.encodeBase64URLSafeString( bytes );
        }
        public static base64URLSafeOfUUIDString( String uuidString ){
        UUID uuid = UUID.fromString( uuidString );
            return UUIDUtil.base64URLSafeOfUUIDObject( uuid );
        }
        private static long zeroLower48BitsOfLong( long longVar ){
            long upper16BitMask =  -281474976710656L;
            return longVar & upper16BitMask;
        }
        private static void zeroUpper16BitsOfLong( long longVar ){
            long lower48BitMask =  281474976710656L-1L;
            return longVar & lower48BitMask;
        }
    }
    
    0 讨论(0)
提交回复
热议问题