2012-06-05 18 views
7

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

11

Simplemente tome string.GetHashCode() que devuelve int de string con una probabilidad de colisión muy baja.

+0

"muy bajo" no es suficiente y no quiero crear mecanismo de resolución de colisiones, parece que aquí sobrecarga – Yan

+0

@ user1437713: ¿Cuántas cadenas hacer ¿tienes? – Tudor

+1

@ 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. –

1

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.

2

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

Cuestiones relacionadas