Was passiert, wenn im Dictionary-Schlüssel eine Hash-Kollision auftritt?
Ich habe Programmierung in c++ und java vollständig von meinem Leben, aber auf C# habe ich das Gefühl, es ist ein ganz anderes Tier.
Im Falle von hash-Kollision Wörterbuch-container in c#, was tut Sie? oder hat es auch eine Erkennung der Kollision?
Im Fall von Kollisionen, die in ähnlichen Containern in SDL, würden einige machen ein Schlüssel-Wert-Abschnitt link-Daten in Schlüssel-Wert-Abschnitt wie Link-Liste, oder einige würden versuchen, verschiedene hash-Methode.
[Update 10:56 A. M. 6/4/2010]
Ich versuche einen Zähler pro Benutzer. Und set user # ist nicht definiert, es kann auch erhöhen oder verringern. Und ich gehe davon aus, dass die Größe der Daten, die über 1000.
So, ich will :
- schnellen Zugriff vorzugsweise nicht in O(n), ist Es wichtig, dass ich in der Nähe der O(1) aufgrund der Anforderung, die ich brauche zu machen sicher, ich kann Kraft, Abmelden, bevor Sie in der Lage sind zu führen etwas albern.
- Dynamisches Wachstum und schrumpfen.
- einzigartige Daten.
Hashmap war meine Lösung, und es scheint Wörterbuch ist das, was ist ähnlich hashmap in c#...
InformationsquelleAutor der Frage Anatoli | 2010-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hash-Kollisionen werden nun korrekt behandelt, von
Dictionary<>
- in, so lange, wie ein Objekt implementiertGetHashCode()
undEquals()
richtig, die entsprechende Instanz zurückgegeben werden, aus dem Wörterbuch.Erste, das solltest du nicht machen keine Annahmen darüber, wie
Dictionary<>
intern arbeitet - das ist eine Implementierung detail, das wahrscheinlich ändern im Laufe der Zeit. Having said that....Was Sie Bedenken müssen, ist, ob die Typen, die Sie für den Schlüssel implementieren
GetHashCode()
undEquals()
richtig. Die grundlegenden Regeln sind, dassGetHashCode()
muss wieder den gleichen Wert für die Lebensdauer des Objekts, und dassEquals()
muss true zurückgeben, wenn zwei Instanzen repräsentieren das gleiche Objekt. Es sei denn, Sie überschrieben,Equals()
verwendet Referenz-Gleichheit - was bedeutet, es gibt nur true, wenn zwei Objekte sind tatsächlich die gleiche Instanz. Können Sie außer Kraft setzen, wieEquals()
geht, aber dann müssen Sie sicherstellen, dass zwei Objekte "gleich" auch erzeugen, die denselben hash-code.Vom performance-Standpunkt aus, können Sie auch wollen, um eine Umsetzung der
GetHashCode()
erzeugt, dass eine gute Streuung der Werte zu reduzieren, die Häufigkeit der hashcode Kollision. Der Nachteil vor allem von hashcode Kollisionen, ist, dass es reduziert das Wörterbuch in eine Liste in Bezug auf Leistung. Wenn zwei verschiedene Instanzen ergeben die gleiche hash-code, in dem Sie gespeichert sind, die gleichen internen Eimer Wörterbuch. Das Ergebnis ist, daß ein linear-scan durchgeführt werden müssen, ruftEquals()
auf jeden Fall, bis eine übereinstimmung gefunden wird.InformationsquelleAutor der Antwort LBushkin
Laut dieser Artikel auf MSDNim Falle einer hash-Kollision die
Dictionary
Klasse wandelt die Eimer in einer verknüpften Liste. Die älterenHashTable
Klasse, auf der anderen Seite, verwendet Aufwärmen.InformationsquelleAutor der Antwort JSBձոգչ
Biete ich eine alternative code-orientierte Antwort, die zeigt, ein Wörterbuch zu zeigen-Ausnahme-Kostenlose und funktional korrekt Verhalten, wenn zwei Elemente mit verschiedenen Schlüsseln Hinzugefügt werden, aber die Tasten führen zu den gleichen hashcode.
Auf .Net 4.6 die Saiten "699391" und "1241308" produzieren den gleichen hashcode. Was passiert im folgenden code?
Dem folgenden code wird veranschaulicht, dass ein .Net-Wörterbuch akzeptiert verschiedene Schlüssel, die zu einer hash-Kollision. Es wird keine exception geworfen und dictionary-Schlüssel-lookup gibt die erwartete Objekt.
InformationsquelleAutor der Antwort camelCase
Überprüfen Sie diesen link für eine gute Erklärung: Eine Umfangreiche Untersuchung von Datenstrukturen Mit C# 2.0
Grundsätzlich .NET generic Wörterbuch-Ketten-Elemente mit dem gleichen hash-Wert.
InformationsquelleAutor der Antwort Groo
Ich glaube, es wird die Größe des zugrunde liegenden array doppelt so groß, dann re-hashes und wird wahrscheinlich ein offener Eimer.
InformationsquelleAutor der Antwort Jesse C. Slicer