Java中用于实现哈希表的广泛使用的哈希算法?
我正在用Java实现一个基本的哈希表数据结构,而不使用集合框架和数组 我打算使用将其引用存储在数组中的单个节点 我是这样做的: 定义一个节点: 创建一个数组,该数组将保存对预先创建的节点对象的引用: 为了获得哈希代码,我使用Java的内置方法->哈希代码 它似乎工作得很好,但是对于第二个键的情况,它返回一个负哈希代码,因此程序终止时会出现异常 我的问题是:Java中用于实现哈希表的广泛使用的哈希算法?,java,hash,hashtable,hash-function,Java,Hash,Hashtable,Hash Function,我正在用Java实现一个基本的哈希表数据结构,而不使用集合框架和数组 我打算使用将其引用存储在数组中的单个节点 我是这样做的: 定义一个节点: 创建一个数组,该数组将保存对预先创建的节点对象的引用: 为了获得哈希代码,我使用Java的内置方法->哈希代码 它似乎工作得很好,但是对于第二个键的情况,它返回一个负哈希代码,因此程序终止时会出现异常 我的问题是: 是否有任何标准的散列算法,我可以用于散列和广泛使用?我写作是为了学习 例如,您可以使用: @Override public int hash
是否有任何标准的散列算法,我可以用于散列和广泛使用?我写作是为了学习 例如,您可以使用:
@Override
public int hashCode() {
return 31 * data + ((key == null) ? 0 : key.hashCode());
}
但是您还需要实现equals。哈希代码被广泛使用。如果hashCode返回负值,您可以使用Math.abs从中获取正值。@Rohan:谢谢您的回答。除了hashCode之外,还有其他哈希算法可以使用吗?Java HashMap和HashSet类在内部使用hashCode。我不知道有任何其他标准方法用于创建哈希代码值。您可以随时查找包含一个的外部库。@Rohan hashCode不是一个算法,它只是访问某些哈希实现的一种方法。@奇怪的是,我要说的是,没有最好的解决方案。您希望在散列范围内很好地分布值,同时希望计算速度更快。这是一个折衷方案,它还取决于您输入到其中的内容的分布。如果您想制作哈希映射之类的内容,则最有可能不包括数据。@Henry yes,如果它是可变的。键也是如此,如果它是可变的。如果可能的话,最好将密钥/数据设置为最终值。
public class MyHashTable {
private Node[] nodeArray = new Node[100];
public MyHashTable() {
for(int i=0 ; i<100; i++) {
nodeArray[i] = new Node();
}
}
private int getIndex(String key) {
long hashCode = key.hashCode();
return (int )hashCode%100;
}
// Other helper methods...
}
@Override
public int hashCode() {
return 31 * data + ((key == null) ? 0 : key.hashCode());
}