【问题标题】:Widely used hashing algorithm in Java for implementing Hash tables?Java中广泛使用的哈希算法用于实现哈希表?
【发布时间】: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 HashMapHashSet 类在内部使用 hashCode()。我不知道用于创建哈希码值的任何其他标准方法。您可以随时查找包含一个的外部库。
  • @Rohan hashCode 不是一种算法,它只是一种访问哈希实现的一种方式。
  • @CuriousMind 我的意思是没有一个最好的解决方案。您希望在哈希范围内很好地分配值,同时您希望它能够快速计算。这是一种折衷方案,还取决于您输入的内容的分布。

标签: java hash hashtable hash-function


【解决方案1】:

你可以使用例如:

@Override
public int hashCode() {
    return 31 * data + ((key == null) ? 0 : key.hashCode());
}

但是你还需要实现equals

【讨论】:

  • data 如果你想制作像哈希映射这样的东西,很可能不应该包括在内。
  • @Henry 是的,如果它是可变的。密钥也是如此,如果它是可变的。如果可能,最好将密钥/数据设为final
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2011-07-25
  • 2011-06-08
  • 2021-09-14
  • 2013-05-31
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多