2014-09-11 11 views
7

Si consideri il seguente codice:Confuso su diverse implementazioni di GetHashCode() per brevi e USHORT

private static void TestHashCode<T>() 
{ 
    dynamic initialValue = 10; 
    Console.WriteLine("{0}: {1}", typeof(T).Name, ((T)initialValue).GetHashCode()); 
} 

TestHashCode<int>(); 
TestHashCode<uint>(); 
TestHashCode<long>(); 
TestHashCode<ulong>(); 
TestHashCode<short>(); 
TestHashCode<ushort>(); 

uscita:

Int32: 10 
UInt32: 10 
Int64: 10 
UInt64: 10 
Int16: 655370 
UInt16: 10 

vedere la differenza tra short e ushort? In effetti, il codice sorgente è diversa per queste classi:

// ushort 
public override int GetHashCode() 
{ 
    return (int) this; 
} 

// short 
public override int GetHashCode() 
{ 
    return (int) (ushort) this | (int) this << 16; 
} 

Ma allo stesso tempo, GetHashCode() implementazioni per firmati/versioni unsigned di int e long sono uguali:

// int and uint 
public override int GetHashCode() 
{ 
    return (int) this; 
} 

// long and ulong 
public override int GetHashCode() 
{ 
    return (int) this^(int) (this >> 32); 
} 

Potrebbe spiegare perché c'è una differenza tra le implementazioni short e ushort di GetHashCode()?

+0

Forse qualcuno ha dimenticato di fare la stessa implementazione per il corto senza firma? .. – dasblinkenlight

+1

Trovo la tua domanda interessante, ma non c'è motivo per cui le due implementazioni dovrebbero essere le stesse, o perché dovrebbero essere diverse. È solo "un'implementazione che funziona". Non c'è alcun vincolo che affermi che hashcode per firmato/non firmato dovrebbe essere lo stesso. In particolare. Questa implementazione è realizzata in modo tale che un ushort breve e uno zero non possa mai avere lo stesso hash. Questo non può essere fatto per interi e long, perché sono grandi almeno quanto l'hash. –

+1

FWIW, 'sbyte' sembra avere lo stesso tipo di implementazione di' short'. –

risposta

-1

in uso GetHashCode(), quando questo = 10;

"return (int) (ushort) this | (int) this < < 16;"

rese 0x0000000a | 0x000a0000 => 0x000a000a = 655370

in long e ulong "return (int) questo^(int) (questo >> 32);" restituisce 0x0000000a xo 0x00000000 ==> 0x0000000a = 10;

quindi immagino che uno di "GetHashCode" abbia un'implementazione errata.

Problemi correlati