Generieren von hash-Objekt konsequent
Ich versuche, einen hash (md5 oder sha) auf ein Objekt.
Habe ich umgesetzt:
http://alexmg.com/post/2009/04/16/Compute-any-hash-for-any-object-in-C.aspx
Bin ich mit nHibernate wieder an meine POCOs aus einer Datenbank.
Beim ausführen von GetHash auf dieser, es ist anders, es ist jedes mal ausgewählt und hydratisiert aus der Datenbank. Ich denke, dies wird erwartet, da die zugrunde liegenden Proxys ändern.
Sowieso,
Gibt es einen Weg, um einen hash, der alle Eigenschaften für ein Objekt, konsequent jedes mal?
Habe ich spielte mit der Idee, einen StringBuilder über diese.GetType().GetProperties..... und erstellen einen hash auf, aber das scheint ineffizient?
Als Seite beachten, dies ist für die änderungsverfolgung diese Entitäten aus einer Datenbank (RDBMS), um ein NoSQL-store
(Vergleich der hash-Werte, um zu sehen, ob Objekte geändert zwischen rdbms und nosql)
- Sind die hashes gespeichert, die zwischen den Sitzungen?
- Weitere Informationen, wie Sie mit der Serialisierung Deserialisierung dieser Objekte. Und sind Sie überschreiben GetHashCode()?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht überschreiben
GetHashCode
Sie nur ErbenObject.GetHashCode
.Object.GetHashCode
im Grunde nur gibt die Speicheradresse der Instanz, wenn es ein Referenz-Objekt. Natürlich, jedes mal, wenn ein Objekt geladen ist, wird Sie wahrscheinlich geladen werden, in einen anderen Teil des Speichers und damit zu einem unterschiedlichen hash-code.Es ist fraglich, ob dass das richtige zu tun; aber das ist, was umgesetzt wurde "back in the day" so kann es nicht mehr ändern jetzt.
Wenn Sie etwas wollen, konsistente dann haben Sie zu überschreiben
GetHashCode
und erstellen Sie einen code auf der Grundlage der "Wert" des Objekts (d.h. der Eigenschaften und/oder Felder). Dies kann so einfach wie eine dezentrale Zusammenführung von hash-codes, der alle Eigenschaften/Felder. Oder es könnte so kompliziert, wie Sie es brauchen.Wenn alles, was Sie suchen, ist etwas zu unterscheiden, von zwei verschiedenen Objekten, dann mit einem eindeutigen Schlüssel auf das Objekt könnte für Sie arbeiten.Wenn Sie suchen, für die die änderungsnachverfolgung, mit dem eindeutigen Schlüssel für die hash-wahrscheinlich nicht zur Arbeit gehenIch einfach alle hash-codes der Felder zu erstellen, die eine vernünftig verteilte hash-code für das übergeordnete Objekt. Zum Beispiel:
Die Verwendung der Primzahl 397 generiert eine eindeutige Nummer für einen Wert eine bessere Verteilung der hash-code. Sehen http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/ für weitere Einzelheiten über die Verwendung von Primzahlen in der hash-code-Berechnungen.
Man könnte natürlich, verwenden Sie reflektion, um auf alle die Eigenschaften, um dies zu tun, aber das wäre langsamer. Alternativ könnte man die CodeDOM zu generieren, code dynamisch zu generieren der hash basiert auf die reflektierenden Eigenschaften und cache-code (d.h. generieren Sie einmal und laden Sie es das nächste mal). Aber, das ist natürlich sehr Komplex und möglicherweise nicht die Mühe Wert.
Einen MD5-oder SHA-hash-und CRC-basiert in der Regel auf einen block von Daten. Wenn Sie das wollen, dann mit dem hash-code der einzelnen Eigenschaft ist nicht sinnvoll. Möglicherweise serialisieren der Daten im Speicher und der Berechnung der hash, der Weg wäre eher zutreffend, als Henk beschreibt.
Object.GetHashCode
nicht zurück, die Speicher-Adresse der Instanz, da dies kann sich ändern, während der GC. Es ist eigentlich nur eine Zufallszahl generiert, die auf den ersten Zugang und verwies auf die von der Objekt-header. Für mehr Informationen, Lesen Sie auf der SyncBlockIndex, die verwendet wird für die Hash-Code und Monitor unter anderem.unchecked
macht keinen Sinn hier.Expressions that contain non-constant terms are unchecked by default at compile time and run time. See checked for information about enabling a checked environment.
docs.microsoft.com/en-us/dotnet/csharp/language-reference/...csharpindepth
link scheint kaputt zu sein, aber ich fand einen anderen link, die erklären, warumGetHashCode()
verwenden solltenunchecked
:the unchecked block can be used as a form of self-documenting code, to say “I am aware that the operation I’m doing here might overflow, and that’s fine with me.”
- erinnern Sie sich, wenn, dass ist der gleiche Grund, aus dem link, den Sie zur Verfügung gestellt?GetHashCode
Wenn das 'hash' ist ausschließlich dazu verwendet, um zu bestimmen, ob Personen geändert haben, dann wird der folgende Algorithmus kann helfen, (NB es ist ungetestet und geht davon aus, dass die gleiche runtime verwendet wird, wenn die Erzeugung von hashes (sonst wird die Abhängigkeit von GetHashCode für 'einfache' Datentypen falsch ist)):
Dieser würde dann verwendet werden, etwa so:
GetHashCode() gibt einen Int32 (nicht MD5).
Wenn Sie erstellen Sie zwei Objekte mit den gleichen Eigenschaftswerte werden Sie nicht die gleichen Hash-wenn Sie die Basis oder-system GetHashCode().
String ist ein Objekt und eine Ausnahme.
Wenn Sie Steuern möchten, Geschlechter-Vergleich der beiden Objekte, dann sollten Sie überschreiben die GetHash und Gleichheit.
Wenn zwei Objekt sind die gleichen, dann müssen Sie auch die gleichen GetHash(). Aber zwei Objekte mit dem gleichen GetHash() sind nicht unbedingt die gleichen. Ein Vergleich testen zuerst die GetHash() und wenn er eine übereinstimmung wird es da testen die Gleich. OK, es gibt einige Vergleiche, die gehen gleich zu Gleich, aber Sie sollte noch überschreiben Sie beide und stellen Sie sicher, dass zwei identische Objekte erzeugen die gleiche GetHash.
Ich benutze diese für die Synchronisation eines Clients mit dem server. Sie konnten alle Eigenschaften oder könnten Sie eine Eigenschaft ändern, ändern Sie die VerID. Der Vorteil hierbei ist ein einfacher, schneller GetHashCode(). In meinem Fall war ich zurücksetzen die VerID mit jeder Eigenschaft ändern bereits.
Landete ich mit ObjID allein, so konnte ich die folgenden
Objekt.GetHashCode-Methode
Zwei Objekte mit der gleichen Eigenschaft Werte. Sind Sie gleich? Produzieren Sie die gleiche GetHashCode()?