Hej wszystkim, czytałem o najlepszym sposobie implementacji nadpisania GetHashCode() dla obiektów w .NET, a większość odpowiedzi, na które napotykam, polega w jakiś sposób na zgniataniu liczb od członków, którzy są typy liczbowe do wymyślenia metody. Problem polega na tym, że mam obiekt, który używa klucza alfanumerycznego jako klucza i zastanawiam się, czy jest coś zasadniczo nie tak z użyciem wewnętrznego identyfikatora obiektów z łańcuchami jako kluczami, coś jak poniżej?GetHashCode() z kluczami ciągów znaków
// Override GetHashCode() to return a permanent, unique identifier for
// this object.
static private int m_next_hash_id = 1;
private int m_hash_code = 0;
public override int GetHashCode() {
if (this.m_hash_code == 0)
this.m_hash_code = <type>.m_next_hash_id++;
return this.m_hash_code;
}
Czy istnieje lepszy sposób wymyślenia unikatowego kodu skrótu dla obiektu, który używa ciągu alfanumerycznego jako klucza? (I nie, części numeryczne ciągu alfanumerycznego nie są unikalne, niektóre z tych ciągów w ogóle nie zawierają liczb.) Wszelkie przemyślenia zostaną docenione!
Ale co jeśli ten ciąg się zmieni? Na przykład mogę utworzyć nowy obiekt użytkownika za pomocą: User foo = new User(); a konstruktor ustawia User.Id = "". Później, jeśli powiem, User.Id = "A12345"; i zwrócę this.Id.GetHashCode() jako wynik foo.GetHashCode(), czy to się nie zmieniło, naruszając zasadę, że kod mieszający obiektu nigdy nie powinien się zmieniać? –
Obiekt zmieniony. Kod skrótu * również musi się zmienić *. –
@King - istnieje kilka różnych sposobów korzystania z kodów skrótów. Wartość kodu skrótu musi być zawsze taka sama, z tą samą wartością początkową. Jeśli twoja wartość jest zmienna, musisz zapisać wynikowy kod skrótu i zwrócić go, gdy zostanie wywołana metoda 'GetHashCode()'. –