我想获得字符串的唯一数字表示。我知道有很多方法可以做到这一点,我的问题是您认为哪种方法最好?我不想有负数 - 所以 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
}
}
如果出现以下情况,您能否建议一个函数来执行此操作:
- 必须有两种方式,即您还可以从数值中恢复原始字符串
- 不一定是双向的
还有其他重要的问题我没有考虑吗?
最佳答案
如果你希望它是可逆的,那你就有麻烦了。哈希设计为单向的。
特别是,鉴于 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/