Es scheint, dass das Thema Wörterbücher, Hash-Tabellen und alle Arten von Hash-Codes auf und ab gemalt wird, und jeder zweite Entwickler, der gegen 01:28 Uhr aus einem Nickerchen am frühen Abend geweckt wird, skizziert schnell den Hashtable-Ausgleichsalgorithmus auf einem Blatt Papier und beweist gleichzeitig alle Eigenschaften in Big-O-Notation.
Vielleicht kann es einen schlechten Dienst leisten, wenn wir uns des Themas unseres Gesprächs so gut bewusst sind, indem wir ein falsches Gefühl des Vertrauens vermitteln: "So einfach ist das! Was könnte hier schief gehen?"
Wie sich herausstellte, kann es! Was genau kann - in ein paar Programmierer-Freitagsgeschichten, gleich nach einem kurzen Bildungsprogramm darüber, was eine Hash-Tabelle ist.
Da der Artikel noch Freitag ist, wird das Bildungsprogramm extrem kurz und akademisch nicht streng sein.
Hash-Tisch für die Kleinen
Sicherlich gingen viele von Ihnen in Polikliniken, Wohnungsbüros, Passbüros und andere Einrichtungen mit einem höheren Grad an Philanthropie des alten Modells. Wenn Sie sich zum Fenster beugen und Ihren Nachnamen (Adresse, Passnummer und Anzahl der Muttermale) sagen, nickt die Löwenzahngroßmutter auf der anderen Seite, schlurft in den Darm des Büros und bringt nach kurzer Zeit Ihr Stück Papier : sei es eine Gesundheitskarte oder sogar ein neuer Reisepass.
Die Magie, die es nicht dem schnellsten Mitarbeiter der Welt ermöglicht, unter Tausenden von anderen das erforderliche Dokument zu finden, ist nichts anderes als eine in der physischen Welt verkörperte Hash-Tabelle:

Bei dieser Datenorganisation verfügt jedes Objekt über einen entsprechenden Hash-Code. Im Falle einer Klinik kann der Hash-Code Ihr Nachname sein.
Die Hash-Tabelle selbst ist eine Art "Kommode" mit Schubladen, von denen jede Objekte enthält, die auf bestimmte Weise nach ihren Hash-Codes gruppiert sind. Warum, fragt man sich, ist diese spezielle Gruppierung notwendig, und warum nicht die Hash-Werte selbst als Inschrift auf den Feldern verwenden? Nun, wahrscheinlich, weil eine Reihe von Kästchen für alle möglichen Nachnamen auf der Welt nicht in jede Poliklinik passt.
: , . "" "", .
( IT), , .
, , - :
- - , .
, "".- - .
, , - , - , .- - , ( ).
- , - , . , .( , ) . , , - , , - .
( ) .
, EF
. -
public class Document
{
public Int32 Id {get; set;}
public String Name {get; set;}
...
}Entity Framework. - .
-:
HashSet<Document> _openDocuments;- , , :
var newDocument = new Document(); // document is created
_openDocuments.Add(newDocument); // document is open, nobody else can edit it.
context.Documents.Add(newDocument);
await context.SaveChangesAsync(); // so it's safe to write the document to the DB, test , ?
Boolean test = _openDocuments.Contains(newDocument);, false, . , - EF Document.
EF Id , ORM . , Id 0, - :
var newDocument = new Document(); // newDocument.Id == 0
_openDocuments.Add(newDocument);
context.Documents.Add(newDocument);
await context.SaveChangesAsync(); // newDocument.Id == 42, , - , , , Document :
public class Document
{
public Int32 Id {get; set;}
public String Name {get; set;}
public override int GetHashCode()
{
return Id;
}
}: - - 0, 42.
: , , , - , GetHashCode Equals . .
, GetHashCode, .
-
- , ( ) , . [20, 20], [30, 30] [20, 20], [20, 20] [30, 30]. , -:
private static IEnumerable<Size> FilterRectangles(IEnumerable<Size> rectangles)
{
HashSet<Size> result = new HashSet<Size>();
foreach (var rectangle in rectangles)
result.Add(rectangle);
return result;
}, , - O(n^2), O(n). , Computer Science, , , , .
HashSet , Size - FCL. , , - :
var a = new Size(20,20).GetHashCode(); // a == 0
var b = new Size(30,30).GetHashCode(); // b == 0, - ( , , , ), , -, .
, , : SizeF, , , :
var a = new SizeF(20,20).GetHashCode(); // a == 346948956
var b = new SizeF(30,30).GetHashCode(); // b == 346948956, a b ! 346948956...
, - , FCL, :
var a = Int64.MinValue.GetHashCode(); // a == 0
var b = Int64.MaxValue.GetHashCode(); // a == 0, .... , , .
? , :
.
- ... (. Resharper).
. - .