Parse.com中的每个对象都有自己的ObjectId,这是一个包含10个字符的字符串,显然它是由这个正则表达式创建的:[0-9a-zA-Z]{10}
。
Parse中的ObjectId示例:
我想将此String转换为Long,因为它可以节省内存并改善搜索。 (使用UTF-8的10个字符有40个字节,1个长度有8个字节)
如果我们计算组合,我们可以找到:
因此,我们可以在不丢失信息的情况下转换这些值。有一种简单的方法可以安全地完成它吗?请考虑任何类型的Chars编码(UTF-8,UTF-16等);
编辑:我只是想以一种艰难的方式解决它。我在问是否有一个简单的方法。答案 0 :(得分:5)
编辑:另外,为什么使用UTF-8字符串作为保证ascii数据?如果您将10个字符ID表示为byte[10]
,那么它只需要10个字节而不是40个字节(即很多更靠近8 long
)。而且你不需要做任何花哨的转换。
答案 1 :(得分:1)
这是一个简单的解决方案,使用6位来存储单个字符。
public class Converter {
private static final String CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static int convertChar(char c) {
int ret = CHARS.indexOf( c );
if (ret == -1)
throw new IllegalArgumentException( "Invalid character encountered: "+c);
return ret;
}
public static long convert(String s) {
if (s.length() != 10)
throw new IllegalArgumentException( "String length must be 10, was "+s.length() );
long ret = 0;
for (int i = 0; i < s.length(); i++) {
ret = (ret << 6) + convertChar( s.charAt( i ));
}
return ret;
}
}
我将long
转换为String
以供您实施,反过来基本相同。
P.s。:如果你真的想节省空间,不要使用Long
,除了开销之外,它与原始long
相比没有任何增加。
Ps 2:另外请注意,这种转换并没有真正节省太多:存储ASCII字符可以用10个字节完成,而long
占用4个。你在这里保存的大部分都是如果将这10个字节存储在字节数组中,您将获得的开销。