Hash-Wert von NSDictionary

9

Ich stieß auf ein Problem, bei dem ich denselben Hash-Wert für verschiedene Wörterbücher erhielt. Vielleicht mache ich etwas offensichtlich falsch, aber ich dachte, Objekte mit anderem Inhalt (nicht gleichwertige Objekte) sollten unterschiedliche Hash-Werte haben.

%Vor%

Irgendwelche Gedanken?

    
Tobias Kräntzer 16.08.2012, 09:18
quelle

5 Antworten

20

Es gibt keine Garantie, dass zwei verschiedene Objekte unterschiedliche Hash-Werte haben.

In der neuesten Open-Source-Version von CoreFoundation , der Hash eines CFDictionary (was einem NSDictionary entspricht) ist definiert als:

%Vor%

und __CFBasicHashHash ist definiert als :

%Vor%

ist einfach die Anzahl der in der Sammlung gespeicherten Einträge. Mit anderen Worten, der Hashwert von [dictA hash] und [dictB hash] ist 1 , die Anzahl der Einträge in den Wörterbüchern.

Obwohl es ein sehr schlechter Hash-Algorithmus ist, hat CF hier nichts falsch gemacht. Wenn Sie einen genaueren Hashwert benötigen, können Sie diesen selbst in einer Obj-C-Kategorie bereitstellen.

    
kennytm 16.08.2012, 09:49
quelle
2

Bei einem Dictionary mit nur ganzen Zahlen, Strings usw. würde ich dict.description.hash als einen schnellen Code verwenden.

    
superarts.org 07.05.2015 05:35
quelle
1

Eine Lösung basierend auf igor-kulagin 's Antwort, die nicht auftragsabhängig ist:

%Vor%

Es besteht jedoch immer noch die Möglichkeit einer Kollision, wenn das Wörterbuch andere Wörterbücher als Werte enthält.

    
Jan Berkel 20.05.2014 13:35
quelle
1

Die Funktion 'hash' ist keine echte Hash-Funktion. Es gibt verschiedene Werte für Strings (alle vorhersagbar), aber für Sammlungen (Arrays und Wörterbücher) gibt es nur die Anzahl zurück. Wenn Sie einen eindeutigen Hashwert haben möchten, können Sie ihn selbst mit Primzahlen oder den Funktionen srandom () und random () berechnen oder eine echte Hashfunktion wie SHA1 erkunden, die in CommonCrypto / CommonDigest.h verfügbar ist.

    
Peter B. Kramer 08.09.2014 21:08
quelle
-2

Ich habe die NSDictionary -Kategorie erstellt und die Methode Hash basierend auf dieser Antwort überschrieben: Best Practices zum Überschreiben von isEqual: und hash

%Vor%

Und schnelle Implementierung.

%Vor%

Dies erfordert auch die Implementierung des Equatable Protokolls für Dictionary , damit Sie auch Hashable Protokollkonformität hinzufügen können.

    
Igor Kulagin 19.09.2013 17:24
quelle

Tags und Links