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?
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 :
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.
Bei einem Dictionary mit nur ganzen Zahlen, Strings usw. würde ich dict.description.hash
als einen schnellen Code verwenden.
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.
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.
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.
Tags und Links objective-c cocoa nsdictionary