java - 一种双向字符串哈希函数

标签 java string hashcode

我想获得字符串的唯一数字表示。我知道有很多方法可以做到这一点,我的问题是您认为哪种方法最好?我不想有负数 - 所以 java 中的 hashcode() 函数不是很好,虽然我可以覆盖它......但我宁愿不这样做,因为我不那么自信并且不想不小心打碎东西。

我的字符串都是语义网 URIS。使用数字表示的原因是,当我在页面上显示 URI 的数据时,我需要将某些内容传递到查询字符串中或放入我的 javascript 中的各个字段中。当您将 URI 作为 URI 中的值时,URI 本身太笨重并且看起来很糟糕。

基本上我想要一个名为 Resource 的类,它看起来像这样

Resource{
  int id;
  String uri;
  String value; // this is the label or human readable name

  // .... other code/getters/setters here

  public int getId(){
    return id = stringToIntFunction();
  }

  private int stringToIntFunction(String uri){
  // do magic here
  }
}

如果出现以下情况,您能否建议一个函数来执行此操作:

  1. 必须有两种方式,即您还可以从数值中恢复原始字符串
  2. 不一定是双向的

还有其他重要的问题我没有考虑吗?

最佳答案

如果你希望它是可逆的,那你就有麻烦了。哈希设计为单向的。

特别是,鉴于 int 有 32 位信息,而 char 有 16 位信息,要求可逆性意味着你只能有零字符串,一两个字符(甚至假设您乐于将 ""编码为 "\0\0"或类似的东西)。当然,这是假设您没有任何存储空间。如果你可以使用存储,那么只需按顺序存储数字......就像:

private int stringToIntFunction(String uri) {
    Integer existingId = storage.get(uri);
    if (existingId != null) {
        return existingId.intValue();
    }
    return storage.put(uri);
}

此处 storage.put() 将在内部增加一个计数器,将 URI 存储为与该计数器值相关联,然后返回它。我猜那不是您想要的。

基本上,要执行可逆加密,我会使用标准加密库,该库首先将字符串转换为二进制格式(例如,使用 UTF-8)。我希望结果是 byte[]

如果它不需要是可逆的,我会考虑只取正常 hashCode() 结果的绝对值(但映射 Integer .MIN_VALUE 到特定的东西,因为它的绝对值不能表示为 int)。

关于java - 一种双向字符串哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6639725/

相关文章:

c++ - 如何打印有序 C++ 字符串数组的直方图?

java - Java中使用equals方法查找相等的对象

java - 改变 HashBiMap 中的值是否安全?

java - "Dynamic"Java代码

java - 膨胀 MaterialAnimatedSwitch 时出错

java - 显示装饰器模式

java - AbstractMap 重写 hashcode 存在问题

java - 如果 Spring 可以成功拦截 @Configuration 类中的类内函数调用,为什么它在常规 bean 中不支持呢?

python - 类型错误 : 'str' object is not callable - Python

python - 如何将 python urandom 转换为字符串?