2014-01-21 72 views
0

我想使用Jake Wharton的DiskLruCache for Android來緩存磁盤上的CouchDb文檔。 CouchDb ID只是任何JSON字符串,所以可以看看Sömething/Like/Thís。但是,圖書館的文檔狀態爲將UTF-8字符串轉換爲字母數字字符串,而不會丟失信息

每個緩存條目都有一個字符串鍵和一個固定數量的值。每個鍵必須匹配正則表達式[a-z0-9_-]{1,64}

所以我需要一種方法來轉換任意字符串以符合正則表達式[a-z0-9_-]{1,64},同時仍然是唯一的。我怎樣才能優雅地做到這一點?

+0

結果仍然應該(至少有點)可讀嗎?我的意思是,假設主要使用ASCII字符,是否應該轉換? –

+0

不,我可能還會注意到:我不必將其轉換回來。所以哈希應該沒問題。 – Maarten

回答

1

如何計算原始JSON字符串的64個字符的散列並將此散列用作緩存的關鍵字?

但是,這不能保證是唯一的。但是,再次,映射任何JSON字符串到* [a-z0-9 _-] {1,64} *永遠不會是反正。

+0

是的,真的!所以我會在Java中生成這個哈希值? – Maarten

+1

是的,看看http://stackoverflow.com/questions/2624192/good-hash-function-for-strings的字符串哈希示例。 – Tobias

-1

如果想要反轉它,則使用散列是不可行的。 Base 64與您的要求不符,但您可以嘗試類似的方法:

僅使用[a-z0-9_-]或更精確地對每個字符進行編碼,如果字符不匹配[a-z0 -9_],將其替換爲前面帶有 - 的unicode值。

+0

是a-z還是a-zA-Z?如果你也可以使用大寫字母,那麼只需用_替換+和/並且 - – Geoffroy

+0

@Maarten我編輯了我的回答 – Geoffroy

0

this question:您可以將原始字符串轉換爲其字節的十六進制表示形式的字符串表示形式。

public String toHex(String arg) { 
    return String.format("%040x", new BigInteger(1, arg.getBytes("UTF-8"))); 
} 

儘管這可能會產生比前一個字符串大得多的字符串,並且可能溢出64個字符的限制。

相關問題