簡體   English   中英

如何將Parse ObjectId(String)轉換為long?

[英]How to convert Parse ObjectId (String) to long?

Parse.com中的每個對象都有自己的ObjectId,這是一個包含10個字符的字符串,顯然它是由這個正則表達式創建的: [0-9a-zA-Z]{10}

Parse中ObjectId的示例:

  • X12wEq4sFf
  • Weg243d21s
  • zwg34GdsWE

我想將此String轉換為Long,因為它將節省內存並改善搜索。 (使用UTF-8的10個字符有40個字節,1個長度有8個字節)

如果我們計算組合,我們可以找到:

  • String ObjectId: 62 ^ 10 = 839299365868340224不同的值;
  • long:是2 ^ 64 = 18446744073709551616不同的值。

因此,我們可以轉換這些值而不會丟失信息。 有一種簡單的方法可以安全地完成它嗎? 請考慮Chars的任何編碼(UTF-8,UTF-16等);

編輯:我只是想以一種艱難的方式來解決它。 我問是否有一個簡單的方法。

  1. 您的字符集是常用Base64編碼的子集,因此您可以使用它。 Java有Base64類,不需要為此編寫自己的編解碼器。
  2. 你確定這實際上有價值嗎? “因為它會節省內存並改善搜索”似乎是一個未經測試的斷言; 在ID上保存幾個字節可能會被每次想要使用某些東西時增加的編碼和解碼成本所抵消。

編輯:另外,為什么你使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM