Hola a todos, he estado leyendo sobre la mejor manera de poner en práctica la anulación GetHashCode() para objetos en .NET, y la mayoría de las respuestas que implican correr a través de los números de alguna manera munging conjunto de los miembros que están tipos numéricos para encontrar un método. El problema es que tengo un objeto que usa una cadena alfanumérica como clave, y me pregunto si hay algo fundamentalmente erróneo con solo usar una identificación interna para objetos con cadenas como claves, algo como lo siguiente?GetHashCode() con claves de cadena
// Override GetHashCode() to return a permanent, unique identifier for
// this object.
static private int m_next_hash_id = 1;
private int m_hash_code = 0;
public override int GetHashCode() {
if (this.m_hash_code == 0)
this.m_hash_code = <type>.m_next_hash_id++;
return this.m_hash_code;
}
¿Hay una mejor manera de llegar a un código hash único para un objeto que utiliza una cadena alfanumérica como su clave? (Y no, las partes numéricas de la cadena alfanumérica no son únicas, algunas de estas cadenas en realidad no tienen números en absoluto). ¡Cualquier pensamiento sería apreciado!
¿Pero y si esa cadena cambia? Por ejemplo, podría crear un nuevo objeto Usuario con: Usuario foo = nuevo Usuario(); y el constructor establece User.Id = "". Más tarde, si digo User.Id = "A12345"; y devuelvo this.Id.GetHashCode() como resultado de foo.GetHashCode(), ¿no habrá cambiado, violando el principio de que el código hash de un objeto nunca debería cambiar? –
El objeto ha cambiado. El código hash * tiene que cambiar también *. –
@King - hay un par de formas diferentes de usar los códigos hash. El valor del código hash debe ser siempre el mismo dado el mismo valor inicial. Si su valor es mutable, necesita almacenar el código hash resultante y devolverlo en su lugar cuando se invoca 'GetHashCode()'. –