diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C
index c5465e71414748b678312d1e1140b102a10bd424..8c6ace6e486a47ebeddd3c247e2807d91317b1c1 100644
--- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C
+++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.C
@@ -44,8 +44,12 @@ Foam::label Foam::HashTable<T, Key, Hash>::eraseMultiple
     const label nTotal = this->size();
     label changed = 0;
 
-    // Terminates early if possible
-    for (InputIter iter = begIter; changed < nTotal && iter != endIter; ++iter)
+    for
+    (
+        InputIter iter = begIter;
+        changed < nTotal && iter != endIter; // terminate early
+        ++iter
+    )
     {
         if (this->erase(*iter))
         {
@@ -444,23 +448,49 @@ template<class T, class Key, class Hash>
 template<class AnyType, class AnyHash>
 Foam::label Foam::HashTable<T, Key, Hash>::erase
 (
-    const HashTable<AnyType, Key, AnyHash>& rhs
+    const HashTable<AnyType, Key, AnyHash>& other
 )
 {
+    // Remove other keys from this table
     const label nTotal = this->size();
     label changed = 0;
 
-    // Remove rhs keys from this table - terminates early if possible
-    // Could optimize depending on which hash is smaller ...
+    if (other.size() < nTotal)
+    {
+        // other is smaller, use its keys for removal
+        using other_iter =
+            typename HashTable<AnyType, Key, AnyHash>::const_iterator;
 
-    // Terminates early if possible
-    for (iterator iter = begin(); changed < nTotal && iter != end(); ++iter)
+        for
+        (
+            other_iter iter = other.begin();
+            changed < nTotal && iter != other.end(); // terminate early
+            ++iter
+        )
+        {
+            if (erase(iter.key()))
+            {
+                ++changed;
+            }
+        }
+    }
+    else
     {
-        if (rhs.found(iter.key()) && erase(iter))
+        // other is same/larger: iterate ourselves and check for key in other
+        for
+        (
+            iterator iter = begin();
+            changed < nTotal && iter != end(); // terminate early
+            ++iter
+        )
         {
-            ++changed;
+            if (other.found(iter.key()) && erase(iter))
+            {
+                ++changed;
+            }
         }
     }
+
     return changed;
 }
 
diff --git a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H
index d7f5f1c60444204ce5b05cfa6bd178a3e1a3d169..6e05951d37bd6e15a8136e9466558a45e64e7a20 100644
--- a/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H
+++ b/src/OpenFOAM/containers/HashTables/HashTable/HashTable.H
@@ -301,7 +301,7 @@ public:
             //  The parameter HashTable needs the same type of key, but the
             //  type of values held and the hashing function are arbitrary.
             template<class AnyType, class AnyHash>
-            label erase(const HashTable<AnyType, Key, AnyHash>& rhs);
+            label erase(const HashTable<AnyType, Key, AnyHash>& other);
 
             //- Resize the hash table for efficiency
             void resize(const label sz);