Как объясняют другие, это опасно.
Способ избежать этого состоит в том, чтобы иметь константное поле, явно указывающее на хэш в ваших изменяемых объектах (так что вы бы хэш на их «идентичности», а не их "государство"). Вы даже можете инициализировать это поле хэша более или менее случайным образом.
Другим трюком будет использование адреса, например. (intptr_t) reinterpret_cast<void*>(this)
в качестве основы для хэша.
Во всех случаях вам нужно отказаться от хэширования изменяющегося состояния объекта.