| 227 | } |
| 228 | |
| 229 | uint32_t dmHashBuffer32(const void * key, uint32_t len) |
| 230 | { |
| 231 | uint32_t h = dmHashBufferNoReverse32(key, len); |
| 232 | |
| 233 | if (dmHashContainer().m_Enabled && len <= DMHASH_MAX_REVERSE_LENGTH) |
| 234 | { |
| 235 | DM_MUTEX_SCOPED_LOCK(dmHashContainer().m_Mutex); |
| 236 | dmHashTable32<ReverseHashEntry>* hash_table = &dmHashContainer().m_HashTable32Entries; |
| 237 | if (hash_table->Get(h) == 0) |
| 238 | { |
| 239 | if (hash_table->Full()) |
| 240 | { |
| 241 | IncreaseTableCapacity(hash_table, dmHashContainer().m_HashTableCapacityIncrement); |
| 242 | } |
| 243 | char* copy = (char*) malloc(len + 1); |
| 244 | memcpy(copy, key, len); |
| 245 | copy[len] = '\0'; |
| 246 | hash_table->Put(h, ReverseHashEntry(copy, len)); |
| 247 | } |
| 248 | } |
| 249 | |
| 250 | return h; |
| 251 | } |
| 252 | |
| 253 | // Based on MurmurHash2A but endian neutral |
| 254 | uint64_t dmHashBufferNoReverse64(const void * key, uint32_t len) |