2012-06-05 13 views
7

Ho alcune classi con chiavi eterogenee - int e string - e voglio lavorare con esse attraverso un'interfaccia comune. È piuttosto semplice convertire semplicemente int in string, ma ovviamente causerà problemi di perfomance. Un'altra opzione che vedo sono box a "oggetto", che non sembra perfetto, o in qualche modo genera interi univoci da stringa (non ci saranno join tra ex "string" e "int" quindi devono essere unici solo in " stringa "dominio" e la query qui è "come"?Come generare un numero intero univoco dalla stringa?

risposta

11

Basta prendere string.GetHashCode() che restituisce un int da un string con probabilità di collisione molto bassa.

+0

"molto basso" non è sufficiente e non voglio creare meccanismo di risoluzione delle collisioni, sembra che in testa qui – Yan

+0

@ user1437713: Quanti stringhe fare hai? – Tudor

+1

@ user1437713 - Quello che vuoi non è possibile. Qualsiasi algoritmo come quello che vuoi ha un rischio di collisioni e molti GUID non sono in realtà unici. –

1

Come sottolineato da @tudor, GetHashCode è il metodo supportato per la produzione di codice hash da stringhe (e altri oggetti). Sfortunatamente non c'è modo di fare una tale trasformazione in modo che un intero rappresenti stringhe univoche a meno che non si pongano severe restrizioni sul set di stringhe.

I.e. se le stringhe sono abbastanza corte (cioè 2 caratteri Unicode o 4 caratteri ASCII) rispetto a una mappatura uno-a-uno evidente o se il set di stringhe è limitato e noto in anticipo.

Alcune letture sull'argomento: il problema sottostante chiamato pigeonhole principle che garantisce la collisione. A causa delle collisioni Birthday paradox è molto probabile che si verifichino su insiemi ragionevolmente piccoli.

2

Attenzione allo string.GetHashCode().
documentazione
.NET afferma https://msdn.microsoft.com/en-us/library/system.string.gethashcode(v=vs.110).aspx

Il codice hash per sé non è garantito per essere stabile. I codici hash per gli stati di stringhe identiche possono variare tra le versioni di.NET Framework e tra piattaforme (come 32-bit e 64-bit) per una versione singola di .NET Framework . In alcuni casi, possono anche differire di dominio di applicazione

Problemi correlati