Java哈希函数返回不超过Integer.MAX_VALUE的int

时间:2016-07-24 21:17:05

标签: java hash

我需要一个哈希函数来返回MAX_VALUE限制下的int;截至目前,我通过我尝试过的方法收到了很大的数据,如下面的链接所示。 My current methods

这是我的问题,因为我使用RandomAccesFile实现了哈希表,并且需要将整个搜索定位到注册或读取

1 个答案:

答案 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;
}