00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "comma/basic/HashUtils.h"
00012 #include <string>
00013 #include <cstring>
00014
00015 using namespace comma;
00016
00017 #define HASH_BASIS 2166136261
00018 #define HASH_PRIME 16777619
00019
00020 uint32_t comma::hashString(const char *x)
00021 {
00022 uint32_t hval = HASH_BASIS;
00023
00024 while (*x) {
00025 hval *= HASH_PRIME;
00026 hval ^= uint32_t(*x++);
00027 }
00028 return hval;
00029 }
00030
00031 uint32_t comma::hashData(const void *ptr, size_t size)
00032 {
00033 const unsigned char *cursor = static_cast<const unsigned char *>(ptr);
00034 const unsigned char *end = cursor + size;
00035 uint32_t hval = HASH_BASIS;
00036
00037 while (cursor != end) {
00038 hval *= HASH_PRIME;
00039 hval ^= uint32_t(*cursor++);
00040 }
00041 return hval;
00042 }
00043
00044 size_t StrHash::operator() (const char *x) const
00045 {
00046 return hashString(x);
00047 }
00048
00049 bool StrEqual::operator() (const char *x, const char *y) const
00050 {
00051 return strcmp(x, y) == 0;
00052 }