2014-01-21 43 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个字符的限制。

相关问题