用java实现随机访问文件的散列

用java实现随机访问文件的散列,java,hash,Java,Hash,我正在java中使用随机访问文件实现哈希,以处理冲突。我需要使用一种方法根据名称生成密钥,以尽量减少冲突。用我的方法,如果收入100条记录,我产生了95次碰撞 请注意,我使用的哈希方法是对长度为6的输入数据字符串进行除法或模运算 这种方法是否有可能改进,或者有其他选择 public int hashCode(String nombre ) { int hash = 1; hash = hash*31 + nombre.hashCode(); System.out.pr

我正在java中使用随机访问文件实现哈希,以处理冲突。我需要使用一种方法根据名称生成密钥,以尽量减少冲突。用我的方法,如果收入100条记录,我产生了95次碰撞

请注意,我使用的哈希方法是对长度为6的输入数据字符串进行除法或模运算

这种方法是否有可能改进,或者有其他选择

public int hashCode(String nombre )  {
    int hash = 1;
    hash =  hash*31 + nombre.hashCode();
    System.out.println("hsh " +hash);
    return Math.abs(hash);
}

您的代码可以归结为:

hash =  31 + nombre.hashCode();
如果字符串相同,则会发生冲突。
您应该将此更改为更有意义

public int hashCode(String nombre )  {
    int hash = new Random().nextInt(); // PLEASE NOTE YOU SHOULD NOT CREATE NEW RANDOM EVERY TIME. CREATE IT ONCE AND JUST USE nextInt()
    hash =  hash*31 + nombre.hashCode();
    System.out.println("hsh " +hash);
    return Math.abs(hash);
}

改进方法或推荐新方法的指南?注意:String.hashCode()不适合此用途。我们已经在Java中实现了一些这样做的东西,但是已经研究了许多替代方案,我的建议是使用一个已经实现了这一点的开源实现;)或者至少阅读代码,以便从中学习。这并不像你想象的那么简单。你有多少桶?bucket越多,冲突越少。bucket是total records*total records如果我想用相同的哈希函数检索记录,我将返回不同的新Random()。nextInt()?