Ist std :: hash für alle stdlib-Distributionen gleich

8

Wenn ich std::hash mit libstdc++ und dann eins mit der kommenden C++11 VS 2012-Bibliothek verwendet habe - würden sie übereinstimmen?

Ich gehe davon aus, dass Hash-Implementierungen nicht Teil der C ++ - Spezifikation sind und nach Verteilung variieren können?

    
Matt Clarkson 16.08.2012, 15:38
quelle

3 Antworten

7

Der Standard sagt das nur:

  

20.8.12 Klassenvorlagenhash Die in 23.5 definierten ungeordneten assoziativen Container verwenden Spezialisierungen des Klassenvorlagenhashs als   Standard-Hash-Funktion. Für alle Objekttypen Schlüssel, für den es existiert   ein Spezialisierungs-Hash, derInstantiierungs-Hash soll:

     
  • erfüllt die Hash-Anforderungen (17.6.3.4), mit Key als Argumenttyp für den Funktionsaufruf, den DefaultConstructible-Anforderungen (Tabelle 19),   die CopyAssignable-Anforderungen (Tabelle 23),
  •   
  • ist austauschbar (17.6.3.2) für lvalues,
  •   
  • liefert zwei verschachtelte Typen result_type und argument_type, die Synonyme für size_t bzw. Key
  • sein sollen   
  • erfüllen die Anforderung, dass, wenn k1 == k2 wahr ist, h (k1) == h (k2) auch wahr ist, wobei h ein Objekt vom Typ hash ist und k1 und k2 sind   Objekte vom Typ Schlüssel.
  •   

in 17.6.3.4 ist dies von größter Wichtigkeit (Tabelle 26):

  

Es werden keine Ausnahmen ausgelöst. Der zurückgegebene Wert hängt nur davon ab   das Argument k. [Note: Also alle Bewertungen des Ausdrucks h (k)   Mit demselben Wert für k ergibt sich dasselbe Ergebnis. - Endnote] [Hinweis:   Für zwei verschiedene Werte t1 und t2 ist die Wahrscheinlichkeit, dass h (t1) und   h (t2) vergleichen gleich sollte sehr klein sein, nähert sich 1.0 / numeric_-   Grenzen :: max (). - Endnote]

Also im Allgemeinen nein, die Berechnung selbst ist nicht definiert und das Ergebnis muss nicht konsistent über Implementierungen sein. In der Tat können sogar zwei verschiedene Versionen derselben Bibliothek zu unterschiedlichen Ergebnissen führen.

    
KillianDS 16.08.2012, 15:47
quelle
7

Nein, das ist nicht garantiert. std::hash muss nur die folgenden Bedingungen erfüllen:

  
  1. Akzeptiert einen einzelnen Parameter vom Typ Key.
  2.   
  3. Gibt einen Wert vom Typ size_t zurück, der den Hash-Wert des Parameters darstellt.
  4.   
  5. Beim Aufruf werden keine Ausnahmen ausgelöst.
  6.   
  7. Für zwei Parameter k1 und k2, die gleich sind, std :: hash () (k1) == std :: hash () (k2).
  8.   
  9. Für zwei verschiedene Parameter k1 und k2, die nicht gleich sind, sollte die Wahrscheinlichkeit std :: hash () (k1) == std :: hash () (k2) sein   Seien Sie sehr klein und nähern Sie sich 1.0 / std :: numeric_limits :: max ().
  10.   

Ссылка

    
user1202136 16.08.2012 15:47
quelle
4

Die Anforderungen ( 17.6.3.4 Hash-Anforderungen [hash.requirements] ) für den von einer Hash -Funktion zurückgegebenen Wert lauten wie folgt:

  

     

Tabelle 26 - Hash-Anforderungen [Hash]

     

Der zurückgegebene Wert hängt nur vom Argument k ab.   [Hinweis: Damit sind alle Bewertungen des Ausdrucks h(k) mit dem   Derselbe Wert für k ergibt das gleiche Ergebnis. -Ende] [Hinweis:   Für zwei verschiedene Werte t1 und t2 , die Wahrscheinlichkeit, dass    h(t1) und h(t2) vergleichen gleich sollte sehr klein sein und nähert sich 1.0 / numeric_limits<size_t>::max() . -Hinweis]

In der Praxis ist es durchaus üblich, dass für ganzzahlige Typen std::hash(k) gleich k ist, da dies die einfachste Implementierung ist, die dem Standard entspricht. Für andere Arten ist alles möglich.

    
ecatmur 16.08.2012 15:50
quelle

Tags und Links