00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_STRING_HASH_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_STRING_HASH_H_
00021
00022 #include <cstddef>
00023
00024 #include "net/instaweb/util/public/string_util.h"
00025
00026 namespace net_instaweb {
00027
00030 template<class CharTransform, typename IntType>
00031 inline IntType HashString(const char* s, size_t len) {
00034 IntType result = 0;
00035 for (size_t i = 0; i < len; ++i, ++s) {
00036 result = (result * 131) + CharTransform::Normalize(*s);
00037 }
00038 return result;
00039 }
00040
00043 inline size_t JoinHash(size_t a, size_t b) {
00044 return (a + 56) * 137 + b * 151;
00045 }
00046
00048 struct CasePreserve {
00056 static unsigned char Normalize(char c) {
00057 return c;
00058 }
00059
00060 static bool Compare(const StringPiece& a, const StringPiece& b) {
00061 return a < b;
00062 }
00063 };
00064
00066 struct CaseFold {
00067 static unsigned char Normalize(char c) {
00068 return LowerChar(c);
00069 }
00070
00071 static bool Compare(const StringPiece& a, const StringPiece& b) {
00072 return StringCaseCompare(a, b) < 0;
00073 }
00074 };
00075
00076 }
00077
00078 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_STRING_HASH_H_