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
Basta prendere string.GetHashCode()
che restituisce un int
da un string
con probabilità di collisione molto bassa.
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.
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
- 1. Ottieni un valore intero univoco dalla stringa
- 2. Come generare ID univoco in Java (intero)?
- 3. Come posso generare un codice hash univoco per una stringa
- 4. Android: numero intero dalla risorsa xml
- 5. Come generare un numero univoco casuale in PostgreSQL usando la funzione
- 6. Converti numero intero in stringa
- 7. Come generare un long UUID univoco
- 8. Come generare un ID univoco in Dart
- 9. Converti numero stringa in numero intero
- 10. Come rappresentare un numero intero superiore a un numero intero
- 11. Come generare un numero casuale dalla distribuzione discreta specificata?
- 12. Algoritmo per generare un ID univoco in C++?
- 13. Come convertire un numero intero in serie
- 14. come mappare una stringa specializzata nel numero intero specificato
- 15. Converti un numero intero in una stringa senza allocare memoria
- 16. Come rimuovere un intero dalla lista?
- 17. JCombobox stringa (visibile) e numero intero (inerente)
- 18. stringa Converti numero intero usando la mappa()
- 19. Come generare un hash univoco per un URL?
- 20. parte std :: stringa in numero intero
- 21. typecast stringa a numero intero - Postgres
- 22. groovy converti stringa "1,503" in numero intero
- 23. Come posso generare un intero da un valore letterale stringa in fase di compilazione?
- 24. Conversione da stringa a numero intero
- 25. VB2010 Come capire se un numero è un intero intero
- 26. Arrotondare un numero intero al numero intero più vicino
- 27. Converti un numero intero in una stringa firmata in Ruby
- 28. Python: Convertire una stringa in un numero intero
- 29. Postscript: come convertire un intero in stringa?
- 30. Generare un numero di sequenza univoco per l'entità durante un giorno
"molto basso" non è sufficiente e non voglio creare meccanismo di risoluzione delle collisioni, sembra che in testa qui – Yan
@ user1437713: Quanti stringhe fare hai? – Tudor
@ 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. –