| 558 | } |
| 559 | |
| 560 | uint64_t dmHashFinal64(HashState64* hash_state) |
| 561 | { |
| 562 | const uint64_t m = 0xc6a4a7935bd1e995ULL; |
| 563 | const int r = 47; |
| 564 | |
| 565 | uint64_t s = hash_state->m_Size; |
| 566 | mmix(hash_state->m_Hash, hash_state->m_Tail); |
| 567 | mmix(hash_state->m_Hash, s); |
| 568 | |
| 569 | hash_state->m_Hash ^= hash_state->m_Hash >> r; |
| 570 | hash_state->m_Hash *= m; |
| 571 | hash_state->m_Hash ^= hash_state->m_Hash >> r; |
| 572 | |
| 573 | if (dmHashContainer().m_Enabled && hash_state->m_ReverseHashEntryIndex && hash_state->m_Size <= DMHASH_MAX_REVERSE_LENGTH) |
| 574 | { |
| 575 | DM_MUTEX_SCOPED_LOCK(dmHashContainer().m_Mutex); |
| 576 | dmHashTable64<ReverseHashEntry>* hash_table = &dmHashContainer().m_HashTable64Entries; |
| 577 | if (hash_table->Get(hash_state->m_Hash) == 0) |
| 578 | { |
| 579 | if (hash_table->Full()) |
| 580 | { |
| 581 | IncreaseTableCapacity(hash_table, dmHashContainer().m_HashTableCapacityIncrement); |
| 582 | } |
| 583 | hash_table->Put(hash_state->m_Hash, dmHashContainer().m_HashStates[hash_state->m_ReverseHashEntryIndex]); |
| 584 | } |
| 585 | else |
| 586 | { |
| 587 | free(dmHashContainer().m_HashStates[hash_state->m_ReverseHashEntryIndex].m_Value); |
| 588 | } |
| 589 | dmHashContainer().FreeReverseHashStatesSlot(hash_state->m_ReverseHashEntryIndex); |
| 590 | hash_state->m_ReverseHashEntryIndex = 0; |
| 591 | } |
| 592 | |
| 593 | return hash_state->m_Hash; |
| 594 | } |
| 595 | |
| 596 | void dmHashRelease64(HashState64* hash_state) |
| 597 | { |