Changeset 52768 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Jan 4, 2010, 4:13:21 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/UStringImpl.cpp
r52758 r52768 82 82 } 83 83 84 // Golden ratio - arbitrary start value to avoid mapping all 0's to all 0's 85 // or anything like that. 86 const unsigned PHI = 0x9e3779b9U; 87 88 // Paul Hsieh's SuperFastHash 89 // http://www.azillionmonkeys.com/qed/hash.html 90 unsigned UStringImpl::computeHash(const UChar* s, int len) 91 { 92 unsigned l = len; 93 uint32_t hash = PHI; 94 uint32_t tmp; 95 96 int rem = l & 1; 97 l >>= 1; 98 99 // Main loop 100 for (; l > 0; l--) { 101 hash += s[0]; 102 tmp = (s[1] << 11) ^ hash; 103 hash = (hash << 16) ^ tmp; 104 s += 2; 105 hash += hash >> 11; 106 } 107 108 // Handle end case 109 if (rem) { 110 hash += s[0]; 111 hash ^= hash << 11; 112 hash += hash >> 17; 113 } 114 115 // Force "avalanching" of final 127 bits 116 hash ^= hash << 3; 117 hash += hash >> 5; 118 hash ^= hash << 2; 119 hash += hash >> 15; 120 hash ^= hash << 10; 121 122 // this avoids ever returning a hash code of 0, since that is used to 123 // signal "hash not computed yet", using a value that is likely to be 124 // effectively the same as 0 when the low bits are masked 125 if (hash == 0) 126 hash = 0x80000000; 127 128 return hash; 84 129 } 130 131 // Paul Hsieh's SuperFastHash 132 // http://www.azillionmonkeys.com/qed/hash.html 133 unsigned UStringImpl::computeHash(const char* s, int l) 134 { 135 // This hash is designed to work on 16-bit chunks at a time. But since the normal case 136 // (above) is to hash UTF-16 characters, we just treat the 8-bit chars as if they 137 // were 16-bit chunks, which should give matching results 138 139 uint32_t hash = PHI; 140 uint32_t tmp; 141 142 size_t rem = l & 1; 143 l >>= 1; 144 145 // Main loop 146 for (; l > 0; l--) { 147 hash += static_cast<unsigned char>(s[0]); 148 tmp = (static_cast<unsigned char>(s[1]) << 11) ^ hash; 149 hash = (hash << 16) ^ tmp; 150 s += 2; 151 hash += hash >> 11; 152 } 153 154 // Handle end case 155 if (rem) { 156 hash += static_cast<unsigned char>(s[0]); 157 hash ^= hash << 11; 158 hash += hash >> 17; 159 } 160 161 // Force "avalanching" of final 127 bits 162 hash ^= hash << 3; 163 hash += hash >> 5; 164 hash ^= hash << 2; 165 hash += hash >> 15; 166 hash ^= hash << 10; 167 168 // this avoids ever returning a hash code of 0, since that is used to 169 // signal "hash not computed yet", using a value that is likely to be 170 // effectively the same as 0 when the low bits are masked 171 if (hash == 0) 172 hash = 0x80000000; 173 174 return hash; 175 } 176 177 } -
trunk/JavaScriptCore/runtime/UStringImpl.h
r52762 r52768 28 28 29 29 #include <wtf/CrossThreadRefCounted.h> 30 #include <wtf/HashFunctions.h>31 30 #include <wtf/OwnFastMallocPtr.h> 32 31 #include <wtf/PossiblyNull.h> … … 162 161 } 163 162 164 static unsigned computeHash(const UChar* s, int length) { ASSERT(length >= 0); return WTF::stringHash(s, length); }165 static unsigned computeHash(const char* s, int length) { ASSERT(length >= 0); return WTF::stringHash(s, length); }166 static unsigned computeHash(const char* s) { return WTF::stringHash(s); }163 static unsigned computeHash(const UChar*, int length); 164 static unsigned computeHash(const char*, int length); 165 static unsigned computeHash(const char* s) { return computeHash(s, strlen(s)); } 167 166 168 167 static UStringImpl& null() { return *s_null; }
Note:
See TracChangeset
for help on using the changeset viewer.