![](/img/trans.png)
[英]How to convert type from ObjectId to Long when using MongoTemplate?
[英]How to convert Parse ObjectId (String) to long?
Parse.com中的每個對象都有自己的ObjectId,這是一個包含10個字符的字符串,顯然它是由這個正則表達式創建的: [0-9a-zA-Z]{10}
。
Parse中ObjectId的示例:
我想將此String轉換為Long,因為它將節省內存並改善搜索。 (使用UTF-8的10個字符有40個字節,1個長度有8個字節)
如果我們計算組合,我們可以找到:
因此,我們可以轉換這些值而不會丟失信息。 有一種簡單的方法可以安全地完成它嗎? 請考慮Chars的任何編碼(UTF-8,UTF-16等);
編輯:我只是想以一種艱難的方式來解決它。 我問是否有一個簡單的方法。
編輯:另外,為什么你使用UTF-8字符串保證ascii數據? 如果你將10個字符ID表示為一個byte[10]
,那只是10個字節而不是40個字節(即很 long
更接近8個字節)。 而且您不需要進行任何花哨的轉換。
這是一個直接的解決方案,使用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
來實現,它基本上是相反的。
Ps:如果你真的想節省空間,不要使用Long
,除了開銷之外,它與原始long
相比沒有任何增加。
Ps 2:另外請注意,這種轉換並沒有真正節省太多:存儲ASCII字符可以用10個字節完成,而long
占用4個。你在這里保存的內容主要是你存儲的開銷。字節數組中的那10個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.