| 423 | } |
| 424 | |
| 425 | uint32_t dmHashFinal32(HashState32* hash_state) |
| 426 | { |
| 427 | const uint32_t m = 0x5bd1e995; |
| 428 | const int r = 24; |
| 429 | uint32_t s = hash_state->m_Size; |
| 430 | mmix(hash_state->m_Hash, hash_state->m_Tail); |
| 431 | mmix(hash_state->m_Hash, s); |
| 432 | |
| 433 | hash_state->m_Hash ^= hash_state->m_Hash >> 13; |
| 434 | hash_state->m_Hash *= m; |
| 435 | hash_state->m_Hash ^= hash_state->m_Hash >> 15; |
| 436 | |
| 437 | if (dmHashContainer().m_Enabled && hash_state->m_ReverseHashEntryIndex && hash_state->m_Size <= DMHASH_MAX_REVERSE_LENGTH) |
| 438 | { |
| 439 | DM_MUTEX_SCOPED_LOCK(dmHashContainer().m_Mutex); |
| 440 | dmHashTable32<ReverseHashEntry>* hash_table = &dmHashContainer().m_HashTable32Entries; |
| 441 | if (hash_table->Get(hash_state->m_Hash) == 0) |
| 442 | { |
| 443 | if (hash_table->Full()) |
| 444 | { |
| 445 | IncreaseTableCapacity(hash_table, dmHashContainer().m_HashTableCapacityIncrement); |
| 446 | } |
| 447 | hash_table->Put(hash_state->m_Hash, dmHashContainer().m_HashStates[hash_state->m_ReverseHashEntryIndex]); |
| 448 | } |
| 449 | else |
| 450 | { |
| 451 | free(dmHashContainer().m_HashStates[hash_state->m_ReverseHashEntryIndex].m_Value); |
| 452 | } |
| 453 | dmHashContainer().FreeReverseHashStatesSlot(hash_state->m_ReverseHashEntryIndex); |
| 454 | hash_state->m_ReverseHashEntryIndex = 0; |
| 455 | } |
| 456 | |
| 457 | return hash_state->m_Hash; |
| 458 | } |
| 459 | |
| 460 | void dmHashRelease32(HashState32* hash_state) |
| 461 | { |