2012-02-12 3 views
1
template<class KEY, class VALUE> 
unsigned int HashMap<KEY, VALUE>::hashCode(KEY key) 
{ 
    unsigned int k = key & 0xffffffff; //error: no match for ‘operator&’ in ‘key & 4294967295u’ 
    k += ~(k<<9); 
    k ^= (k>>14); 
    k += (k<<4); 
    k ^= (k>>10); 
    return k; 
}; 

알다시피, 객체의 비트를 조작하여 hashCode를 구현하려고합니다. 분명히 비트 연산자는 사용자 정의 된 객체에 쉽게 적용되지 않습니다.HashMap 구현 : --- hashcode

나는 메모리 위치를 고려하여 임의의 유형의 객체 비트를 가져 와서 원하는대로 비트를 조작하려고합니다. 그러면 비트를 int로 재 해석하고 비트 연산자를 int에 적용합니다.

좋은 생각 같습니까? 그리고 주어진 메모리 위치에서 어떤 종류의 객체로부터 비트를 취할 수 있습니까?

고맙습니다.

답변

2

을 구현하는 간단하다 타입의 평등에 대한 정의. 두 개의 문자열이 같을 수도 있습니다 (모두 "hello world"을 포함하지만 두 포인터가 다른 점을 나타 내기 때문에 다른 포인터를 가짐). 메모리 블록을 포함하고 있으므로 해시 키 구현은 두 개의 동일한 객체에 대해 다른 해시 키를 반환합니다.

즉, 해시 테이블을 중단하면 사용자가 테이블에 넣은 개체를 찾을 수 없습니다.

+0

이것은 모두 사실입니다. – StilesCrisis

1

좋은 생각이 아닙니다.

개체의 구성원에 대한 세부 정보가 없으면 해시에 실제로 유용하거나 관련이있는 비트를 알 수 없습니다. 예를 들어, 정렬 문제로 인해 실제 데이터 멤버간에 메모리 갭이 생길 수 있으며 갭은 초기화되지 않으므로 가비지 데이터로 가득 찼습니다. 또는 데이터 멤버가 char 배열 문자열이면 null 종결 자 이후의 모든 바이트가 가비지이며 해시에 기여하지 않아야합니다.

C++에서 간단한 리플렉션을 구현하는 방법은 실제로 여기에서 원하는 모든 것을 할 수있는 매크로를 사용합니다 (즉, 모든 구조체의 멤버와 유형을 찾을 수 있음). 그러나 정상적인 오픈 소스에 대해서는 잘 모릅니다. 내 머리. 우리는 작업중인 코드베이스에있는 템플릿을 가지고 있습니다. 템플릿은 정확히 원하는 것을 수행합니다. 즉, 임의의 구조체에 대해 해쉬 함수를 만들 수 있습니다.하지만 공유 할 수는 없습니다.

0

임의의 유형의 객체 일부를 가져 와서 메모리가 주어진 경우 위치에 있고 원하는대로 비트를 조작하고 싶습니다.

여기서 말하는 것은 데이터 구조의 기본 비트 표현을 일련의 비트로 조작하려는 경우입니다.

이 접근법은 기본 유형, 예 : ints, chars 등등.

예에서 KEY은 무엇이든 될 수 있으며 기본 비트는 구조의 크기만큼이므로 and 작업이 실제로 도움이되지 않습니다.

또한 KEY은 파생 클래스가 될 수 있으며 기본 구조의 일부인 가상 포인터 주소 등을 타격하기 시작할 수 있습니다.

어쨌든 코드 (비록 당신이 그런 식으로하고 어떤 친구가 전문가를 인도 할 수 있다고 결정했다하더라도)은 내 의견으로는 너무 복잡 할 것입니다.

가장 좋은 방법은 hash object.This의 구성원의 각 것이 접근 방식은 적어도 자바에서 추구하고 존중하지 않기 때문에 아니, 그것은 끔찍한 생각

+1

틈새를 남겨두기 때문에 기본 유형에는 작동하지 않으며 널 종결 자 다음에 쓰레기가있는 문자 배열도 작동하지 않습니다. 자세한 내용은 이전 답변을 참조하십시오. – StilesCrisis

+0

당신 말이 맞습니다. 저는 java에서와 같이 실제 원시 (primitive)를 염두에 두었습니다. 예를 들어 int의 해시는 숫자 자체 – Cratylus