2017-11-29 21 views
-3

저는 C를 지금 배우고 있는데, CS50 edx 과정에서 작성중인 맞춤법 검사 프로그램을 위해이 해시 함수를 처음 만들었습니다.왜 비트 시프트 연산자가 내 해시 함수를 빠르게 만들까요?

int hashing(char *word)  
{ 

    unsigned int hash = 0; 
    for (int i = 0, n = strlen(word); i < n; i++) 
     hash += word[i]; 
    return hash % HTABLE_SIZE; 
} 

그럼 난 비트 시프트 연산자를 사용 레딧에 hash function 우연히.

int hashing(char *word) 
{ 
    unsigned int hash = 0; 
    for (int i = 0, n = strlen(word); i < n; i++) 
     hash = (hash << 2)^word[i]; 
    return hash % HTABLE_SIZE; 
} 

이 해시 함수를 사용하면 프로그램 속도가 0.13 초에서 0.06 초로 향상되었습니다. 누군가이 해시 함수가 왜 그렇게 빨리 설명되는지 제발 설명해 주시겠습니까?

+0

프로그램을 어떻게 컴파일합니까? 완전히 최적화 되었습니까? – Evert

+0

https://stackoverflow.com/a/6357747/6935629 – rsp

+1

어떤 컴파일러를 사용하고 있습니까? 또한 온라인에서 [Compiler Explorer] (https://godbolt.org)를 사용하여 소스에서 생성 된 어셈블리 코드를 확인하십시오. –

답변

1

shift + xor가 더하기보다 빠르다고 생각하지 않습니다.

그러나 결과 해시 테이블은 해시 값이 훨씬 잘 분산되어 있기 때문에 훨씬 빠릅니다.