0

I am implementing a basic HashTable data structure in Java without using collection framework and Arrays.

I intend to use individual nodes whose reference I would store in an array.

I am doing it this way:

Define a Node:

class Node {

    private int data;
    private String key;
    private Node next;
    // Other helper methods
}

Create an array which would hold reference to pre-created Node objects:

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...
}

For getting the hash-code, I am using the Java's inbuilt method -> hashCode().

It seems to be working fine, however for the case in which the key is "second", it returns a negative hash code and because of which the programs terminates with an exception.

My question is:

Is there any standard hashing algorithm which I can use for hashing and which is widely used? I am writing for learning purpose.

12
  • 2
    hashCode() is widely used. You can use Math.abs() to get a positive value from the hashCode() if it is returning negative. Commented Dec 6, 2017 at 19:41
  • @Rohan: Thanks for your response. Is there any other hashing algorithm other than hashCode() which we can use? Commented Dec 6, 2017 at 19:47
  • 1
    The Java HashMap and HashSet classes use hashCode() internally. I don't know of any other standard methods used to create a hash code value. You can always look for some external library that contains one. Commented Dec 6, 2017 at 19:50
  • 1
    @Rohan hashCode isn't an algorithm, it is merely a way to access some implementation of hashing. Commented Dec 6, 2017 at 19:52
  • 1
    @CuriousMind what I am saying is there is no one best solution. You want to distribute the values pretty good over the hash range and at the same time you want it to be fast to compute. It is a compromise that also depends on the distribution of the things you feed into it. Commented Dec 8, 2017 at 9:16

1 Answer 1

1

You could use for example:

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

But you also need to implement equals.

Sign up to request clarification or add additional context in comments.

2 Comments

data should most likely not be included if you want to make something like a hash map.
@Henry yes, if it's mutable. The same goes for key, if it's mutable. It's better to make key / data final if possible.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.