| Index: Source/wtf/HashTable.h
|
| diff --git a/Source/wtf/HashTable.h b/Source/wtf/HashTable.h
|
| index e99bc1e9cdccd0232083343cba1855cad9eb97f7..5e3751dacc449fa7146d1207c955b7745e2723ed 100644
|
| --- a/Source/wtf/HashTable.h
|
| +++ b/Source/wtf/HashTable.h
|
| @@ -485,6 +485,7 @@ namespace WTF {
|
|
|
| static const int m_maxLoad = 2;
|
| static const int m_minLoad = 6;
|
| + static const int perturbShift = 5;
|
|
|
| ValueType* m_table;
|
| int m_tableSize;
|
| @@ -561,16 +562,6 @@ namespace WTF {
|
| {
|
| }
|
|
|
| - inline unsigned doubleHash(unsigned key)
|
| - {
|
| - key = ~key + (key >> 23);
|
| - key ^= (key << 12);
|
| - key ^= (key >> 7);
|
| - key ^= (key << 2);
|
| - key ^= (key >> 20);
|
| - return key;
|
| - }
|
| -
|
| #if ASSERT_DISABLED
|
|
|
| template<typename Key, typename Value, typename Extractor, typename HashFunctions, typename Traits, typename KeyTraits>
|
| @@ -603,11 +594,11 @@ namespace WTF {
|
| {
|
| checkKey<HashTranslator>(key);
|
|
|
| - int k = 0;
|
| int sizeMask = m_tableSizeMask;
|
| ValueType* table = m_table;
|
| unsigned h = HashTranslator::hash(key);
|
| - int i = h & sizeMask;
|
| + unsigned i = h;
|
| + unsigned perturb = h;
|
|
|
| if (!table)
|
| return 0;
|
| @@ -623,7 +614,7 @@ namespace WTF {
|
| #endif
|
|
|
| while (1) {
|
| - ValueType* entry = table + i;
|
| + ValueType* entry = table + (i & sizeMask);
|
|
|
| // we count on the compiler to optimize out this branch
|
| if (HashFunctions::safeToCompareToEmptyOrDeleted) {
|
| @@ -649,9 +640,8 @@ namespace WTF {
|
| m_stats->recordCollisionAtCount(perTableProbeCount);
|
| #endif
|
|
|
| - if (k == 0)
|
| - k = 1 | doubleHash(h);
|
| - i = (i + k) & sizeMask;
|
| + perturb >>= perturbShift;
|
| + i = i*5 + perturb + 1;
|
| }
|
| }
|
|
|
| @@ -662,11 +652,11 @@ namespace WTF {
|
| ASSERT(m_table);
|
| checkKey<HashTranslator>(key);
|
|
|
| - int k = 0;
|
| ValueType* table = m_table;
|
| int sizeMask = m_tableSizeMask;
|
| unsigned h = HashTranslator::hash(key);
|
| - int i = h & sizeMask;
|
| + unsigned i = h;
|
| + unsigned perturb = h;
|
|
|
| #if DUMP_HASHTABLE_STATS
|
| atomicIncrement(&HashTableStats::numAccesses);
|
| @@ -681,7 +671,7 @@ namespace WTF {
|
| ValueType* deletedEntry = 0;
|
|
|
| while (1) {
|
| - ValueType* entry = table + i;
|
| + ValueType* entry = table + (i & sizeMask);
|
|
|
| // we count on the compiler to optimize out this branch
|
| if (HashFunctions::safeToCompareToEmptyOrDeleted) {
|
| @@ -712,9 +702,8 @@ namespace WTF {
|
| m_stats->recordCollisionAtCount(perTableProbeCount);
|
| #endif
|
|
|
| - if (k == 0)
|
| - k = 1 | doubleHash(h);
|
| - i = (i + k) & sizeMask;
|
| + perturb >>= perturbShift;
|
| + i = i*5 + perturb + 1;
|
| }
|
| }
|
|
|
| @@ -725,11 +714,11 @@ namespace WTF {
|
| ASSERT(m_table);
|
| checkKey<HashTranslator>(key);
|
|
|
| - int k = 0;
|
| ValueType* table = m_table;
|
| int sizeMask = m_tableSizeMask;
|
| unsigned h = HashTranslator::hash(key);
|
| - int i = h & sizeMask;
|
| + unsigned i = h;
|
| + unsigned perturb = h;
|
|
|
| #if DUMP_HASHTABLE_STATS
|
| atomicIncrement(&HashTableStats::numAccesses);
|
| @@ -744,7 +733,7 @@ namespace WTF {
|
| ValueType* deletedEntry = 0;
|
|
|
| while (1) {
|
| - ValueType* entry = table + i;
|
| + ValueType* entry = table + (i & sizeMask);
|
|
|
| // we count on the compiler to optimize out this branch
|
| if (HashFunctions::safeToCompareToEmptyOrDeleted) {
|
| @@ -775,9 +764,8 @@ namespace WTF {
|
| m_stats->recordCollisionAtCount(perTableProbeCount);
|
| #endif
|
|
|
| - if (k == 0)
|
| - k = 1 | doubleHash(h);
|
| - i = (i + k) & sizeMask;
|
| + perturb >>= perturbShift;
|
| + i = i*5 + perturb + 1;
|
| }
|
| }
|
|
|
| @@ -821,11 +809,11 @@ namespace WTF {
|
|
|
| ASSERT(m_table);
|
|
|
| - int k = 0;
|
| ValueType* table = m_table;
|
| int sizeMask = m_tableSizeMask;
|
| unsigned h = HashTranslator::hash(key);
|
| - int i = h & sizeMask;
|
| + unsigned i = h;
|
| + unsigned perturb = h;
|
|
|
| #if DUMP_HASHTABLE_STATS
|
| atomicIncrement(&HashTableStats::numAccesses);
|
| @@ -840,7 +828,7 @@ namespace WTF {
|
| ValueType* deletedEntry = 0;
|
| ValueType* entry;
|
| while (1) {
|
| - entry = table + i;
|
| + entry = table + (i & sizeMask);
|
|
|
| // we count on the compiler to optimize out this branch
|
| if (HashFunctions::safeToCompareToEmptyOrDeleted) {
|
| @@ -871,9 +859,8 @@ namespace WTF {
|
| m_stats->recordCollisionAtCount(perTableProbeCount);
|
| #endif
|
|
|
| - if (k == 0)
|
| - k = 1 | doubleHash(h);
|
| - i = (i + k) & sizeMask;
|
| + perturb >>= perturbShift;
|
| + i = i*5 + perturb + 1;
|
| }
|
|
|
| if (deletedEntry) {
|
|
|