2016-01-14 148 views
0

我有很多用作HBase表中键的url。由于它们“全部”由http://开始,因此Hbase将它们放在同一个节点中。因此,我以+ 100%的节点结束,另一个空闲。将字符串转换为可逆的字符串,在Java中

所以,我需要将url映射到类似散列的东西,但是可逆的。在JAVA8中有没有简单,标准和快速的方法来做到这一点。

我寻找前缀的随机(线性)分布。

注:

  • 扭转了自URL很多的URL与/ ? =和风险结束不平衡的分布是不感兴趣。

  • 我不需要加密,但我可以接受它。

  • 我不看压缩,但令人欣慰的是如果可能的话:)

感谢, 海东青

+0

删除HTTP://? –

+0

为什么不在保存前从网址中删除协议,如果你真的需要,可以为此添加另一列? 你不能颠倒散列。根本不是他们如何工作。 – Zhedar

+0

我必须保持网址完整。我知道一个哈希不是这个工作,我想像AES或ZIP之类的东西?谢谢:) – Costin

回答

3

这里没有一个单一的,标准的方式。

你可以做的一件事就是将密钥加上其前缀。喜欢的东西:

a01cc0fe http://... 

这是很容易恢复(只需剪掉哈希字符,你可以是一个固定长度),将让你很好的分布。

字符串的散列码在JVM之间是稳定和一致的。计算它的算法在String.hashCode's documentation中指定,所以您可以将它视为String如何工作的合约的一部分。

+1

在所有JVM上,在所有机器上,字符串的哈希值是否相同?如果是这样,它可能会完成这项工作。 – Costin

+0

是的;我会更新我的答案。 – yshavit

+0

我终于使用了这个想法。我已经通过了前2个字节从它的MD5为前缀的网址中六。 hashCode()不适合用于平衡目的。谢谢。 – Costin

1

添加由36位十进制数[0-9a-z]编码的哈希码前缀。

public static String encode(String s) { 
    return Integer.toString(s.hashCode() & 0xffffff, 36) + "#" + s; 
} 

public static String decode(String s) { 
    return s.replaceFirst("^[^#]*#", ""); 
} 

样品:

http://google.com/ <-> 5o07l#http://google.com/ 
+0

嗨,我用这个想法,但具有更好的散列(MD5的第一个字节)谢谢。 – Costin