Per risolverlo è conveniente utilizzare una funzione hash che restituisce un valore univoco per ogni riga (hash).
C++11 ha una funzione integrata per ottenere un hash: hash.  
In futuro, per contare il numero di hash, è meglio utilizzare la tabella hash unordered_map, che è apparsa anche in C++ 11. Puoi saperne di più sull'utilizzo di map nel corso Dynamic data structure -> Array associativi: map.

Un esempio di come ottenere un hash dalla stringa "test":

hash<stringa> hash_fn;
size_t str_hash = hash_fn("test" );
cout<<str_hash;


Il risultato sarà: "2949673445", quindi da ogni stringa univoca puoi ottenere un hash univoco che può essere utilizzato come chiave nella  unordered_map.

L'hashing di una stringa è una rappresentazione di una stringa come un numero, univoco (assumendo che la possibilità di una collisione sia trascurabile) per ogni stringa. Ciò consente di memorizzare tutti i dati importanti (come le password) nel database non come stringhe, ma come numeri. Ciò ti consente di proteggere le password se un utente malintenzionato ottiene l'accesso al database delle password, perché non otterrà le password stesse, ma solo la loro rappresentazione numerica, ed è quasi impossibile ottenere una stringa dal suo hash (soprattutto senza conoscere l'algoritmo di hashing ). 
Gli hash polinomiali sono usati più spesso nella programmazione di problemi di competizione.
Uno dei modi migliori per determinare la funzione hash della stringa S è il seguente:
h(S)  =  S[0]  +  S[1] * P  +  S[2] * P^2  +  S[3] * P^3  +  ...  +  S[N] * P^N