Hey alle, ich habe gelesen, auf die beste Weise, die GetHashCode() - Überschreibung für Objekte in .NET zu implementieren, und die meisten Antworten, die ich renne, beinhalten irgendwie Zahlen von Mitgliedern, die sind numerische Typen, um mit einer Methode zu kommen. Problem ist, habe ich ein Objekt, das eine alphanumerische Zeichenfolge als Schlüssel verwendet, und ich frage mich, ob etwas grundlegend falsch ist mit nur einer internen ID für Objekte mit Zeichenfolgen als Schlüssel, etwas wie folgt verwenden?GetHashCode() mit String-Schlüsseln
// 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;
}
Gibt es eine bessere Art und Weise für ein Objekt mit einem eindeutigen Hash-Code zu entwickeln, die eine alphanumerische Zeichenfolge als Schlüssel verwendet? (Und nein, die numerischen Teile der alphanumerischen Zeichenfolge sind nicht eindeutig; einige dieser Zeichenfolgen enthalten überhaupt keine Zahlen.) Alle Gedanken wären willkommen!
Aber was ist, wenn sich diese Zeichenfolge ändert? Zum Beispiel könnte ich ein neues Benutzerobjekt erstellen mit: Benutzer foo = new User(); und der Konstruktor setzt User.Id = "". Später, wenn ich User.Id = "A12345" sage; und ich gebe this.Id.GetHashCode() als das Ergebnis von foo.GetHashCode() zurück, hat es sich nicht geändert, verletzt das Prinzip, dass sich der Hash-Code eines Objekts nie ändern sollte? –
Das Objekt wurde geändert. Der Hash-Code * muss sich ebenfalls ändern *. –
@King - es gibt ein paar verschiedene Möglichkeiten, Hash-Codes zu verwenden. Der Wert des Hash-Codes muss bei gleichem Startwert immer gleich sein. Wenn Ihr Wert veränderbar ist, müssen Sie den resultierenden Hashcode speichern und ihn stattdessen zurückgeben, wenn 'GetHashCode()' aufgerufen wird. –