首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码UUIDS的传统算法(例如Base32、Base62)的替代方案

编码UUIDS的传统算法(例如Base32、Base62)的替代方案
EN

Stack Overflow用户
提问于 2011-07-07 14:41:34
回答 2查看 2.8K关注 0票数 3

我们需要将大量的UUIDS转换为与xml兼容的字符串。如果我们使用Base32算法(它将每个5位映射到32个字符中的一个),这将导致26个字符字符串,如果我们使用Base62算法(它迭代地将128位整数除以62,并将模数记录为62个字符中的一个),这将导致22个字符字符串。虽然base62返回较短的字符串,但它对cpu的消耗要大得多,因此我们不得不使用Base32 (因为Base64不是一个选项)。

你知道其他类型的编码算法可以帮助我们吗?是否有类似Base32的位模式编码算法的变体可以与非2的幂的基一起使用?或者,是否存在将第一种算法的方法与第二种算法的方法相结合的混合算法?如果可能,我们希望将字符字符串减少到26个以下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-07 16:47:46

您提到了62,这表明您将字母表限制为A-Z (大写和小写)和数字0-9。为什么不在列表中添加另外两个与XML兼容的字符,比如+.~!,使这个数字达到64个呢?您将能够进行位移位而不是除法,这将使算法与Base32算法一样快,并减小字符串大小。

编辑:由于这些字符也可用于其他尚未指定的语言的限制,您可能会注意转义一些字符来表示您的64个选项。例如,如果您使用_作为转义字符,则可以让_1和_2表示选项63和64。原始问题中提到的统计数据表明,UUIDS是128位的,所以如果没有转义,我们的Base64将给我们22个字符,并且在最多4个项目被转义的情况下,将保持在26个字符内。

票数 3
EN

Stack Overflow用户

发布于 2011-08-25 12:11:17

维基百科提供了两个版本的Base64,它们可以在XML名称空间中使用。

http://en.wikipedia.org/wiki/Base64#XML。我写了下面的Java,用JAVA做URLSafe,guid,(调用theObjectReturned.toString()以guid字符串的形式获得它)。

我见过其他Java代码,它们被认为是非常快的,可以很容易地进行修改,以实现XML安全变体:

http://iharder.sourceforge.net/current/java/base64/

代码如下。保存在名为UUIDUtil.java的文件中

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6606817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档