2011-11-06 35 views
15

Duplicar posible:
How do I create a HashCode in .net (c#) for a string that is safe to store in a database?¿Es portable la función hash de cadenas .NET?

utilizo C# 4.0 y obtiene el hash cadena invocando:

"my string".GetHashCode() 

Código generado por esta llamada se almacena en la base de datos para el futuro utilizar. Este código hash se usa para buscar algún subconjunto de cadenas y luego para compararlo por igual.

Las preguntas son:

  1. ¿Es un cálculo de comprobación aleatoria estandarizada? ¿Puedo suponer que es posible calcular el mismo hash en diferentes entornos como C# en .Net 3.0 o futuras ediciones .Net?
  2. ¿Es posible calcular la misma función hash en usted escribiendo en Java, PL/SQL, Ruby, etc.?
  3. ¿Puedo suponer que el hash generado hoy será el mismo mañana en en el mismo entorno? Por ejemplo, cuando apago mi computadora y vuelvo a ejecutar el programa, o cambio la configuración regional, o algunas otras configuraciones?
  4. ¿Cuáles son los límites de la portabilidad?
  5. Sé que puedo hacerlo usted mismo, pero ¿se proporciona algún tipo de portabilidad?
+13

Las respuestas a sus preguntas son NO, NO, NO, NO, NO, no hay ninguna "portabilidad" en absoluto, y no hay ninguna "portabilidad" en absoluto. ** Bajo ninguna circunstancia debe hacer lo que está describiendo. ** –

Respuesta

18

De MSDN:

La implementación predeterminada del método GetHashCode no garantiza valores de retorno únicas para diferentes objetos. Además, .NET Framework no garantiza la implementación predeterminada del método GetHashCode, y el valor que devuelve será el mismo entre las diferentes versiones de .NET Framework. En consecuencia, la implementación predeterminada de este método no se debe usar como un identificador de objeto único para propósitos de hash.

Así que no, no se puede suponer que el valor producido por GetHashCode es estable. Esto tampoco es solo teórico: we've seen the value change in the past.

Si quiere un hash estable, tendrá que generarlo usted mismo.

+0

"La implementación predeterminada" - ¿'String' usa la implementación predeterminada? Honestamente, no sé, simplemente no lo esperaría (ya que son tratados por valor en tablas hash). – delnan

+3

'System.String' anula' GetHashCode', y contiene una nota similar en [su documentación] (http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx): * El comportamiento de GetHashCode depende de su implementación, que podría cambiar de una versión del tiempo de ejecución de lenguaje común a otra. Una razón por la que esto podría suceder es mejorar el rendimiento de GetHashCode. * Y * El valor devuelto por GetHashCode depende de la plataforma. Difiere en las versiones de 32 bits y 64 bits de .NET Framework. * –

2

No. No es portátil. Debería nunca utilizar este método para cualquier cosa que no sea equilibrar un árbol hash. su implementación ha cambiado entre versiones del Framework, y se comporta de manera diferente para CLR de 32 bits/64 bits.

Eric Lippert tiene un blog post sobre las reglas y usos apropiados para esta función.

En su lugar, debe utilizar SHA1Managed para insertar un hash en la base de datos.

3

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

el.NET Framework no garantiza la implementación predeterminada de el método GetHashCode, y el valor que devuelve será el mismo entre las diferentes versiones de .NET Framework. En consecuencia, la implementación predeterminada de este método no se debe usar como un identificador único de objeto con fines de hashing.

Cuestiones relacionadas