Jelajahi Sumber

Preserve equal-hash order during rehash

Brian Fiete 4 tahun lalu
induk
melakukan
3da1881c9b
1 mengubah file dengan 20 tambahan dan 7 penghapusan
  1. 20 7
      BeefySysLib/util/MultiHashSet.h

+ 20 - 7
BeefySysLib/util/MultiHashSet.h

@@ -164,17 +164,30 @@ public:
 	{
 	{
 		auto newHashHeads = (Entry**)TFuncs::AllocateZero(sizeof(Entry*) * newHashSize, alignof(Entry*));
 		auto newHashHeads = (Entry**)TFuncs::AllocateZero(sizeof(Entry*) * newHashSize, alignof(Entry*));
 
 
+		SizedArray<Entry*, 32> entryList;
+
 		for (int hashIdx = 0; hashIdx < mHashSize; hashIdx++)
 		for (int hashIdx = 0; hashIdx < mHashSize; hashIdx++)
 		{
 		{
 			Entry* checkEntry = mHashHeads[hashIdx];
 			Entry* checkEntry = mHashHeads[hashIdx];
-			while (checkEntry != NULL)
+			if (checkEntry != NULL)
 			{
 			{
-				auto nextEntry = checkEntry->mNext;
-				int newHashIdx = (checkEntry->mHash & 0x7FFFFFFF) % newHashSize;
-				checkEntry->mNext = newHashHeads[newHashIdx];
-				newHashHeads[newHashIdx] = checkEntry;
-
-				checkEntry = nextEntry;
+				// We want to keep elements with equal hashes in their insert order so we need to 
+				// iterate through the linked list in reverse
+				entryList.Clear();
+				
+				while (checkEntry != NULL)
+				{
+					entryList.Add(checkEntry);
+					checkEntry = checkEntry->mNext;
+				}
+				
+				for (int i = (int)entryList.mSize - 1; i >= 0; i--)
+				{
+					auto checkEntry = entryList[i];					
+					int newHashIdx = (checkEntry->mHash & 0x7FFFFFFF) % newHashSize;
+					checkEntry->mNext = newHashHeads[newHashIdx];
+					newHashHeads[newHashIdx] = checkEntry;
+				}
 			}
 			}
 		}
 		}