Domanda

Ne ho un paio So che il valore di pair.first non può essere superiore a 1000. So anche che pair.second, la stringa, è sempre di 1 parola. Mai più di 1 parola.
Quindi, per costruire il valore Hash per la coppia sto facendo quanto segue:

pair<int,string> p;
hash<char*> H;
hash_vale = H(p.second)*1000 + p.first;

Penso che questo darà valori univoci purché il valore di hash delle stringhe non sia troppo grande e che H (p. secondo) fornirà 1-1 mapping. Questi presupposti sono validi?

Grazie,

È stato utile?

Soluzione

Per definizione, un hash non può essere uno a uno a causa del principio del buco del piccione. Ad esempio, ci sono 2 ^ 32 possibili valori hash, ma stringhe molto più possibili. Quindi devono esserci due stringhe con lo stesso valore di hash.

In secondo luogo, quasi sicuramente stai causando un overflow moltiplicando il valore dell'hash per 1000, poiché un hash dovrebbe usare tutti i 32 bit. Stai molto meglio scartando l'int e poi mescolando gli hash. Boost ha una funzione hash_combine : a + 0x9e3779b9 + (b < < 6) + (b > > 2);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top