Tengo algunas clases con claves heterogéneas, int y string, y quiero trabajar con ellas a través de una interfaz común. Es bastante simple simplemente convertir int en una cadena, pero obviamente causará problemas de rendimiento. Otra opción que veo es ponerlas en "objeto", que tampoco parece perfecto, o de alguna manera generar enteros únicos a partir de la cadena (no habrá uniones entre "cadena" e "int" anteriores, por lo que deben ser únicos solo en " string "domain" y el quetsion aquí es "cómo"?¿Cómo generar un número entero único a partir de una cadena?
Respuesta
Simplemente tome string.GetHashCode()
que devuelve int
de string
con una probabilidad de colisión muy baja.
Como señaló @tudor, GetHashCode es la forma admitida de producir código hash a partir de cadenas (y otros objetos). Lamentablemente, no hay forma de realizar dicha transformación, por lo que un entero representa cadenas exclusivas a menos que aplique severas restricciones al conjunto de cadenas.
I.e. si sus cadenas son lo suficientemente cortas (es decir, 2 caracteres Unicode o 4 caracteres ASCII), existe un mapeo obvio de uno a uno, o si su conjunto de cadenas es limitado y conocido de antemano.
Algunas lecturas sobre el tema: el problema subyacente llamado pigeonhole principle que garantiza la colisión. Debido a Birthday paradox es muy probable que se produzcan colisiones en conjuntos razonablemente pequeños.
Tenga en cuenta string.GetHashCode()
.
documentación
.NET establece https://msdn.microsoft.com/en-us/library/system.string.gethashcode(v=vs.110).aspx
El código hash en sí mismo no se garantiza que sea estable. Los códigos Hash para de cadenas idénticas pueden diferir en las versiones de .NET Framework y en plataformas (como 32 bits y 64 bits) para una versión única de .NET Framework. En algunos casos, incluso pueden variar según el dominio de aplicación
- 1. Generar ID único a partir de la cadena alfanumérica
- 2. ¿Cómo puedo generar un entero a partir de un literal de cadena en tiempo de compilación?
- 3. ¿Cómo puedo generar una secuencia a partir de una cadena?
- 4. Generar una frase pseudonatural a partir de un entero grande de forma reversible
- 5. Crear una cadena de dos dígitos a partir de un entero de un solo dígito
- 6. Cadena binaria al número entero
- 7. generar aleatoria de 64 bits número entero
- 8. convierte una cadena a un entero
- 9. Lectura de un entero a partir de la entrada estándar
- 10. número entero no 'se reduce a un número entero'
- 11. puntero a partir de un número entero en C en una plataforma embebida
- 12. ¿Cómo generar un alfanumérico único?
- 13. construye un número único para una cadena en Java
- 14. Convertir un número entero en una cadena sin asignar memoria
- 15. convertir un número entero en una cadena como 3
- 16. Cómo generar una identificación única en Java (Entero)?
- 17. Verificar si una cadena contiene un número entero
- 18. ¿Cómo puedo generar un hash largo de una cadena?
- 19. cómo saber si una variable es una tupla, una cadena o un número entero?
- 20. ¿Cómo agregar un número entero a una matriz?
- 21. Convertir una cadena a un entero en Android
- 22. ¿Cómo generar un número aleatorio a partir de la distribución discreta especificada?
- 23. cómo generar una cadena única
- 24. Cómo devolver un valor Enum a partir de una cadena?
- 25. ¿Cómo creo un org.xml.sax.InputSource a partir de una cadena?
- 26. Cadena de formato, número entero con ceros a la izquierda
- 27. ¿Cómo puedo fácilmente (en java) generar nombres de archivo a partir de una cadena de máscara?
- 28. ¿Número entero del mapa (id) a la cadena de texto?
- 29. ¿Cómo convertir una cadena (con cero inicial o no) a un número entero?
- 30. Conversión de cadena a entero
"muy bajo" no es suficiente y no quiero crear mecanismo de resolución de colisiones, parece que aquí sobrecarga – Yan
@ user1437713: ¿Cuántas cadenas hacer ¿tienes? – Tudor
@ user1437713 - Lo que quiere no es posible. Cualquier algoritmo como lo que quiera tiene un riesgo de colisiones. Los GUID no son en realidad únicos. –