我们需要将大量的UUIDS转换为与xml兼容的字符串。如果我们使用Base32算法(它将每个5位映射到32个字符中的一个),这将导致26个字符字符串,如果我们使用Base62算法(它迭代地将128位整数除以62,并将模数记录为62个字符中的一个),这将导致22个字符字符串。虽然base62返回较短的字符串,但它对cpu的消耗要大得多,因此我们不得不使用Base32 (因为Base64不是一个选项)。
你知道其他类型的编码算法可以帮助我们吗?是否有类似Base32的位模式编码算法的变体可以与非2的幂的基一起使用?或者,是否存在将第一种算法的方法与第二种算法的方法相结合的混合算法?如果可能,我们希望将字符字符串减少到26个以下。
发布于 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个字符内。
发布于 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的文件中
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;
}}
https://stackoverflow.com/questions/6606817
复制相似问题