2012-06-15 3 views
0

64 비트 정수만 해시를 원합니다. 나는 주어진 murmurhash3의 구현을 사용하고 있습니다. 이 제약 조건에서 코드가 약간 향상 될 수 있습니까? 나는 그것을 완전히 이해할 수는 없지만 라인 171의 ​​for 루프가 목표라고 생각합니다. 여기에 제안 해주세요.murmurhash3 개선 제안

+0

코드가 atm과 어떻게 비슷합니까? – RedX

+0

거기에 쓰여진 코드를 수정하려고하는데 정수 필터 목록을 가지고 있고 블룸 필터를 만든 다음 멤버쉽 쿼리에 해쉬하기를 원합니다. –

답변

2

해시 64 비트 숫자 만 필요하면 숫자 값을 사용하십시오. 모든 murmur3은 동일한 입력 번호를 동일한 입력 번호와 혼합하는 낭비 CPU주기가 발생하므로 시드 값을 변경하는 경우는 예외입니다.

당신이 정말로 고정 된 크기를 최적화하려는 경우, 당신은 복사 기능을, 그냥 약간은 (컴파일러 상수 전파하고 무거운 작업을 수행하는 상수 폴딩 가능) 변경할 수 있습니다 :

void MurmurHash3_x86_128_uint64 (const void * key, uint32_t seed, void * out) 
{ 
    const int len = sizeof(uint64_t); 
    //now len is a compile time constant, and can be folded when this 
    //function is not inlined (else it would just be a constant input, 
    //which could only be folded when the function is inlined) 
    const uint8_t * data = (const uint8_t*)key; 
    const int nblocks = len/16; 

경우를 일부 스마트 컴파일러 (ICC, MSVC, GCC)가 기능하는 경우 감지 것,

또한
template<const size_t len> 
void MurmurHash3_x86_128_uint64 (const void * key, uint32_t seed, void * out) 
{ 
    const uint8_t * data = (const uint8_t*)key; 
    const int nblocks = len/16; 

주의 : 당신 이후 단계에서 C++를 사용하고, 그것의 라인을 따라 템플릿이 점을 설정하는 의미를 만들 것 같은 상수 인수 (p artly 상수 인수 목록) 및 해당 상수를 함수로 접을 수 있습니다 (이 경우 "전체 프로그램 최적화"옵션이 활성화되어 있어야합니다).

+0

답변 해 주셔서 감사합니다. 정말 큰 도움이되었습니다. 또한 중얼 거리는 해시를 읽을 곳을 물어보고 싶습니다. 나는 단지 알고리즘에 대한 통찰력이없는 덤불 주위를 두드리고있다. 지금은 코드 자체를 디코딩하고있다. 나는 당신이'mix' 함수를 위해 제안한 최적화를 놓쳤을 것이다. –

+0

@AmanDeepGautam : 유일한 실제 장소는 http://burtleburtle.net/bob을 시도 할 수있는 것 이외에 이미 가지고있는 링크 (http://code.google.com/p/smhasher/) 및 소스 코드입니다. /hash/doobs.html 많은 해쉬 함수를 나열하고, 도움이 될 것입니다 (그리고 특성의 분석을 위해 http://www.team5150.com/~andrew/noncryptohashzoo/). – Necrolis

+0

'MurmurHash3_x86_128_uint64'의 변경된 버전을 구현했지만 구현에서'fmix' 부분을 제거하지 않았습니다. 왜냐하면 "CPU주기가 낭비되었으므로"제안했기 때문입니다. 이 해시 함수가 어떻게 작동하는지에 대한 많은 증거가 없으므로이 해시 함수의 구조를 엉망으로 다루는 것이 낫지 않다고 판단했습니다. 내가 한 것은 데이터 형식을 64 비트 int로 두 번 가져 와서 64 비트 'uint62_t'로 캐스팅했습니다. 이 방법은 해시를 계산하는 메서드의 구조가 변경되지 않으며 128 비트 해시 값을 얻습니다. 이 apporach에 대한 의견을 듣고 싶습니다. –