【发布时间】:2018-05-20 19:11:10
【问题描述】:
我在 Java 中实现了一个基本的 HashTable 数据结构,而不使用集合框架和数组。
我打算使用将其引用存储在数组中的单个节点。
我是这样做的:
定义一个节点:
class Node {
private int data;
private String key;
private Node next;
// Other helper methods
}
创建一个数组来保存对预先创建的 Node 对象的引用:
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...
}
为了获取哈希码,我使用的是 Java 的内置方法 -> hashCode()。
它似乎工作正常,但是对于键为“第二个”的情况,它返回一个负哈希码,因此程序以异常终止。
我的问题是:
是否有任何标准的散列算法可以用于散列并且被广泛使用?我写作是为了学习。
【问题讨论】:
-
hashCode()被广泛使用。如果返回负数,您可以使用Math.abs()从hashCode()获取正值。 -
@Rohan:感谢您的回复。除了 hashCode() 之外,我们还可以使用其他哈希算法吗?
-
Java
HashMap和HashSet类在内部使用hashCode()。我不知道用于创建哈希码值的任何其他标准方法。您可以随时查找包含一个的外部库。 -
@Rohan
hashCode不是一种算法,它只是一种访问哈希实现的一种方式。 -
@CuriousMind 我的意思是没有一个最好的解决方案。您希望在哈希范围内很好地分配值,同时您希望它能够快速计算。这是一种折衷方案,还取决于您输入的内容的分布。
标签: java hash hashtable hash-function