2017-12-06 24 views
0

컬렉션 프레임 워크와 배열을 사용하지 않고 Java에서 기본 HashTable 데이터 구조를 구현하려고합니다.해시 테이블을 구현하기 위해 Java에서 널리 사용되는 해시 알고리즘은 무엇입니까?

내가 참조로 배열에 저장할 개별 노드를 사용하려고합니다. 를 얻기 위해

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

:

class Node { 

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

참조하기 위해 미리 만든 노드 객체를 보유 할 배열을 만듭니다

이 노드를 정의

나는 이런 식으로 일을하고있다 해시 코드, Java의 inbuilt 메서드 -> hashCode()를 사용하고 있습니다.

키가 "second"인 경우 음수 인 해시 코드를 반환하므로 프로그램이 예외로 종료됩니다.

내 질문은 :

내가 해싱에 사용할 수있는 널리 어떤을 사용하는 모든 표준 해시 알고리즘이 있습니까? 나는 학습 목적으로 쓰고있다. 당신은 예를 들어 사용할 수

+2

'hashCode()'가 널리 사용됩니다. 'Math.abs()'를 사용하면 음수를 반환하는 경우 'hashCode()'에서 양수 값을 얻을 수 있습니다. – Rohan

+0

@Rohan : 답변 해 주셔서 감사합니다. 사용할 수있는 hashCode() 이외의 다른 해싱 알고리즘이 있습니까? – CuriousMind

+1

자바'HashMap'과'HashSet' 클래스는 내부적으로'hashCode()'를 사용합니다. 해시 코드 값을 만드는 데 사용 된 다른 표준 메소드에 대해서는 알지 못합니다. 당신은 항상 하나를 포함하는 외부 라이브러리를 찾을 수 있습니다. – Rohan

답변

1

:

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

그러나 당신은 또한 equals를 구현해야합니다.

+0

해시 맵과 같은 것을 만들고 싶다면'data'를 포함시키지 않는 것이 가장 좋습니다. – Henry

+0

@Henry yes, 변경 가능하다면 키와 동일합니다. 가능한 경우 키/데이터를 '최종'으로 만드는 것이 좋습니다. –