在Java中将字符串转换为可逆的字符串

时间:2016-01-14 15:18:06

标签: java java-8 hbase bijection

我有很多url作为HBase表中的键。因为他们"所有"从http://开始,Hbase将它们放在同一个节点中。因此,我以+ 100%的节点结束,另一个空闲。

所以,我需要将url映射到类似哈希的东西,但是可逆。在JAVA8中是否有任何简单,标准和快速的方法。

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

注意:

  • 撤销网址并不感兴趣,因为很多网址都以/ ? =结尾,并且有可能导致分配失衡。

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

  • 我不寻求压缩,但如果可能的话,欢迎使用:)

谢谢, 斯丁

2 个答案:

答案 0 :(得分:3)

这不是一种标准的方式。

您可以做的一件事就是在密钥前加上哈希值。类似的东西:

a01cc0fe http://...

这很容易逆转(只需剪掉散列字符,你就可以制作一个固定的长度)并且可以很好地分发。

字符串的哈希码在JVM中是稳定且一致的。计算它的算法在String.hashCode's documentation中指定,因此您可以将其视为String如何工作的合同的一部分。

答案 1 :(得分: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/