tim33
6739 단어 IM
가장 쉬 운 버 전.
uint32_t time33(char const *str, int len) { uint32_t hash = 0; for (int i = 0; i < len; i++) { hash = hash *33 + (unsigned long) str[i]; } return hash; }
이 버 전 은 time 33 의 알고리즘 사고방식 을 가장 잘 나 타 낼 수 있어 서 매우 간단 하 다.
곱셈 조작 을 비트 조작 으로 바꾸다 unsigned long time33(char const *str, int len)
{
unsigned long hash = 0;
for (int i = 0; i < len; i++) {
hash = ((hash <<5) + hash) + (unsigned long) str[i];
}
return hash;
}
59 글자 1000 0000 회 실행(gcc 는 최 적 화 를 열지 않 았 습 니 다.최 적 화 된 두 함수 의 실제 코드 가 같 기 때 문 입 니 다)
첫 번 째:
real 0m4.389s user 0m4.388s sys 0m0.000s
두 번 째:
real 0m4.137s user 0m4.120s sys 0m0.000s
gcc–O2 최적화 후
real 0m1.367s user 0m1.360s sys 0m0.000s
php 버 전
inline unsigned time33(char const*str, int len) { unsigned long hash = 5381; /* variant with the hash unrolled eight times */ for (; len >= 8; len -= 8) { hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; hash = ((hash << 5) + hash) + *str++; } switch (len) { case 7: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */ case 6: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */ case 5: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */ case 4: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */ case 3: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */ case 2: hash = ((hash << 5) + hash) + *str++; /* fallthrough... */ case 1: hash = ((hash << 5) + hash) + *str++; break; case 0: break; } return hash; }
59 글자,1000 0000 회
real 0m1.088s user 0m1.068s sys 0m0.000s
속도 향상 은 주로 순환 전개 에 있 습 니 다.짧 은 문자 에 대해 서 는 뚜렷 하지 않 습 니 다.
php 버 전의 hash 초기 값 은 5381 입 니 다.
Magic Constant 5381:
1. odd number
2. prime number
3. deficient number
4. 001/010/100/000/101 b
아파 치 버 전
unsigned long time33(char const *str, int *len) { unsigned long hash = 0;
const char *p=str; if (*len<=0) { for(p = str; *p; p++) { hash = hash * 33 + *p; } *len = p - str; } else { int i = *len; for (p = str;i; i--, p++) { hash = hash * 33 + *p; } } return hash; }
테스트 결과
real 0m1.418s user 0m1.412s sys 0m0.004s
종합 적 으로 나의 개선 버 전
#define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) //php 버 전 unsigned long time33(char const *str, int len=-1) { unsigned long hash = 5381; /* variant with the hash unrolled eight times */ char const *p = str; if (unlikely(len<0)) { for(; *p; p++) { hash = hash * 33 + *p; } return hash; }
#define TIME33_HASH_MIXED_CH() hash = ((hash<<5)+hash) + *p++ for (; len >= 8; len -= 8) { TIME33_HASH_MIXED_CH(); //1 TIME33_HASH_MIXED_CH(); //2 TIME33_HASH_MIXED_CH(); //3 TIME33_HASH_MIXED_CH(); //4 TIME33_HASH_MIXED_CH(); //5 TIME33_HASH_MIXED_CH(); //6 TIME33_HASH_MIXED_CH(); //7 TIME33_HASH_MIXED_CH(); //8 } switch (len) { case 7: TIME33_HASH_MIXED_CH(); /* fallthrough... */ case 6: TIME33_HASH_MIXED_CH(); /* fallthrough... */ case 5: TIME33_HASH_MIXED_CH(); /* fallthrough... */ case 4: TIME33_HASH_MIXED_CH(); /* fallthrough... */ case 3: TIME33_HASH_MIXED_CH(); /* fallthrough... */ case 2: TIME33_HASH_MIXED_CH(); /* fallthrough... */ case 1: TIME33_HASH_MIXED_CH(); break; case 0: break; } return hash; }
#undef TIME33_HASH_MIXED_CH
테스트 결과
real 0m1.072s user 0m1.064s sys 0m0.000s
테스트 해 봤 는데 중 복 률 은 1/2000 입 니 다.
왜 33 의 배수 입 니까?
기타 배수
Ngix 는 time 31 을 사용 합 니 다.
Tokyo Cabinet 는 time 37 을 사용 합 니 다.
Bob 은 그의 글 에서 소문 자 영어 어 휘 는 33 에 적합 하고 대소 문 자 를 섞 어 65 를 사용한다 고 말 했다.time 33 은 영어 어휘 hash 에 적합 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
poj 3624 Charm Bracelet(01 가방 입문문)Charm Bracelet Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10399 Accepted: 4667 Description Bessie has go...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.