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

在Java中,将字符串转换为可逆的内容,java,java-8,hbase,bijection,Java,Java 8,Hbase,Bijection,我有很多URL作为HBase表中的键。由于它们“全部”以http://开头,Hbase将它们放在同一个节点中。因此,我以+100%的节点结束,另一个节点处于空闲状态 因此,我需要将url映射到类似散列的东西,但是是可逆的。在JAVA8中有没有简单、标准和快速的方法来实现这一点 我寻找前缀的随机(线性)分布。 注: 反转url并不有趣,因为很多url都以/结尾=和分配不平衡的风险 我不需要加密,但我可以接受 我不寻求压缩,但如果可能,欢迎使用:) 谢谢, Costin没有单一的标准方法 您可以

我有很多URL作为HBase表中的键。由于它们“全部”以http://开头,Hbase将它们放在同一个节点中。因此,我以+100%的节点结束,另一个节点处于空闲状态

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

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

注:

  • 反转url并不有趣,因为很多url都以
    /结尾=和分配不平衡的风险

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

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

谢谢,
Costin

没有单一的标准方法

您可以做的一件事是在密钥前面加上散列。比如:

a01cc0fe http://...
这是很容易可逆的(只需剪掉hash字符,您可以将其设置为固定长度),并将获得良好的分发


字符串的哈希代码在JVM中是稳定和一致的。计算它的算法是指定的,所以你可以把它看作是一个字符串如何工作的一部分。

< P>没有一个标准的方式。< /P> 您可以做的一件事是在密钥前面加上散列。比如:

a01cc0fe http://...
这是很容易可逆的(只需剪掉hash字符,您可以将其设置为固定长度),并将获得良好的分发


字符串的哈希代码在JVM中是稳定和一致的。计算它的算法是指定的,所以你可以把它看作是一个字符串如何工作的一部分。< /P> < P>添加由36个十进制数[09AZ]编码的哈希代码的前缀。< /P>
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/
http://google.com/   5o07l#http://google.com/

添加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/
http://google.com/   5o07l#http://google.com/

删除http://?为什么不在保存之前从url中删除协议,如果您真的需要,可以添加另一列?不能反转哈希。这根本不是它们的工作方式。我必须保持URL的完整性。我知道哈希不适合工作,我想到AES或ZIP之类的东西?谢谢:)我只想补充一点,您不想随便考虑您的hbase行键。这可能是唯一最关键的设计决策。在发现分发不好之前,您不希望有1亿行,或者无法以您想要的方式高效地读取数据。这是一个不错的阅读:@ax123man我已经阅读了您几个小时前提到的博客帖子,但是这个解决方案涉及到太多的应用程序更改。很好,但是我们今天不能做。谢谢删除http://?为什么不在保存之前从url中删除协议,如果您真的需要,可以添加另一列?不能反转哈希。这根本不是它们的工作方式。我必须保持URL的完整性。我知道哈希不适合工作,我想到AES或ZIP之类的东西?谢谢:)我只想补充一点,您不想随便考虑您的hbase行键。这可能是唯一最关键的设计决策。在发现分发不好之前,您不希望有1亿行,或者无法以您想要的方式高效地读取数据。这是一个不错的阅读:@ax123man我已经阅读了您几个小时前提到的博客帖子,但是这个解决方案涉及到太多的应用程序更改。很好,但是我们今天不能做。字符串的散列在所有JVM和所有机器上都是相同的吗?如果是这样的话,它可能会起作用。我终于使用了这个想法。我已经用md5中的前2个字节作为url的前缀。hashCode()不适合用于平衡目的。谢谢。字符串的哈希值在所有JVM和所有机器上都是一样的吗?如果是这样的话,它可能会起作用。我终于使用了这个想法。我已经用md5中的前2个字节作为url的前缀。hashCode()不适合用于平衡目的。谢谢。嗨,我用过这个主意,但是有更好的散列(md5的第一个字节)谢谢。嗨,我用过这个主意,但是有更好的散列(md5的第一个字节)谢谢。