我需要一个哈希函数来返回MAX_VALUE限制下的int;截至目前,我通过我尝试过的方法收到了很大的数据,如下面的链接所示。 My current methods
这是我的问题,因为我使用RandomAccesFile实现了哈希表,并且需要将整个搜索定位到注册或读取
答案 0 :(得分:1)
<强> 1 强> 你使用的方法是返回多头。如果出于安全目的不需要散列,则应使用的方法是String.hashCode()。确保在散列之前通过String.valueOf(int)将整数转换为String,因为你说你也想要散列整数。
int hash = String.valueOf(input).hashCode();
<强> 2 强> 编辑:在评论中请求OP后添加MD5信息
我有一个类可以接受输入String,通过MD5处理它,并将其转换为long,但我不知道如何将其转换为int。您可以做的是返回long,并将其截断为int的10个字符。这是班级:
import java.security.*;
public class HX {
final String seed;
final MessageDigest md;
final long hash;
public HX(String s) throws NoSuchAlgorithmException {
seed = s;
md = MessageDigest.getInstance("MD5");
hash = computeHash();
}
public long getHash() {
return hash;
}
public long computeHash() {
md.reset();
final byte[] digest = md.digest(seed.getBytes());
return (computeHash(digest, 0) ^ computeHash(digest, 8));
}
private static final long computeHash(final byte[] array, final int offset) {
long value = 0;
for (int i = 0; i < 8; i++) {
value = ((value << 8) | (array[offset+i] & 0xFF));
}
return value;
}
}
截断后它仍然可能超过MAX_VALUE,但是,如果是这种情况,则需要将其截断为长度为9的int。
long longHash = 0;
try {
HX h = new HX(seed);
longHash = h.getHash();
} catch(Exception e) {
e.printStackTrace();
}
try {
int hash = Integer.parseInt(longHash.substring(0,9));
} catch(Exception e) {
int hash = Integer.parseInt(longHash.substring(0,8));
}
第3 强> 如果您想要替代MD5,我有一个很久以前从一篇帖子中下载的方法,声称他的“更好的哈希”减少了冲突;根据我的记忆,一些带有数千个词典单词列表的测试似乎证实了这一点。
public static int hash(String s) {
int hash = 0;
for (int i = 0; i < s.length(); i++) {
hash = 257*hash + s.charAt(i);
}
return h;
}