2011-11-03 17 views
7

Uno de mis clientes sufrió un bloqueo de aplicación y lo rastreé debido a este error/función que realmente no puedo explicar.
El WindowsIdentity.GetCurrent(). Name.GetHashCode() devuelve esta cadena: -? 2097695743
Sí, eso es un signo menos, un espacio, un signo de interrogación y luego los números reales de hash.C# string.GetHashCode() devuelve resultado no int

Este es el código de una aplicación de consola simple que muestra el comportamiento extraño.

static void Main(string[] args) 
{ 
    Console.WriteLine("From String: string name = WindowsIdentity.GetCurrent().Name");    
    string name = WindowsIdentity.GetCurrent().Name; 
    Console.WriteLine("name:       " + name); 
    Console.WriteLine("name.GetHashCode().GetType(): " + name.GetHashCode().GetType()); 
    Console.WriteLine("name.GetHashCode():    " + name.GetHashCode()); 
    Console.WriteLine("name.GetHashCode().ToString(): " + name.GetHashCode().ToString()); 
    Console.WriteLine(); 
    Console.WriteLine(); 
    Console.WriteLine("Direct"); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name:       " + WindowsIdentity.GetCurrent().Name); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name.GetHashCode().GetType(): " + WindowsIdentity.GetCurrent().Name.GetHashCode().GetType()); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name.GetHashCode():    " + WindowsIdentity.GetCurrent().Name.GetHashCode()); 
    Console.WriteLine("WindowsIdentity.GetCurrent().Name.GetHashCode().ToString(): " + WindowsIdentity.GetCurrent().Name.GetHashCode().ToString()); 
    Console.WriteLine(); 
    Console.WriteLine(); 
    Console.WriteLine("Press Enter to continue"); 
    Console.ReadLine(); 
} 

Ésta es la salida de texto:

From String: string name = WindowsIdentity.GetCurrent().Name 
name:       COMMARC\tje 
name.GetHashCode().GetType(): System.Int32 
name.GetHashCode():    - ?2097695743 
name.GetHashCode().ToString(): - ?2097695743 

Direct 
WindowsIdentity.GetCurrent().Name:       COMMARC\tje 
WindowsIdentity.GetCurrent().Name.GetHashCode().GetType(): System.Int32 
WindowsIdentity.GetCurrent().Name.GetHashCode():    - ?2097695743 
WindowsIdentity.GetCurrent().Name.GetHashCode().ToString(): - ?2097695743 


Press Enter to continue 

Y esta es una imagen de la misma salida:

Weird GetHashCode return value

Mi pregunta es: ¿Cómo demonios es esto posible?

ACTUALIZACIÓN: el problema estaba en la configuración funky de Windows para números negativos.

+2

No lo es. Sospecho que la terminal está loca. (La única otra posibilidad es que 'int.ToString()' sea incorrecto, pero lo dudo). –

+0

¿Qué sucede si escribe el resultado de la aplicación de la consola en un archivo usando '>' (es decir, 'yourApp.exe'>' out.txt') o usar algo como 'File.WriteAllText()' o 'Debug.WriteLine()' – fardjad

+4

Podría ser choque de cultura. ¿Qué imprime 'Name.GetHashCode(). ToString (CultureInfo.InvariantCulture)' print? –

Respuesta

8

Si ese es el resultado en la computadora del cliente (pero no el tuyo o el nuestro), es posible que la máquina del usuario haya configurado ventanas específicamente para usar "-?" como el símbolo numérico negativo. Windows está perfectamente dispuesto a dejarte hacer eso, o cualquier otro formato extraño.

Como una prueba, acabo de configurar Windows en mi máquina para usar "-?", Y ejecutar una aplicación de consola simple como la tuya produce números negativos formateados como el resultado de tu ejemplo. Si ese es el caso en la máquina de su cliente, no hay nada de malo con el funcionamiento de GetHashCode, es solo un artefacto del formato de Windows.

+0

voy a marcar esto como respuesta como lo fue primero. ustedes dos son correctos. –

7

El problema no es con GetHashCode(), el problema es con Int32.ToString(). Que es consciente de las preferencias del usuario para formatear números negativos. Panel de control + región e idioma, pestaña Formatos, botón Configuración adicional. Pestaña Números, configuración del símbolo de signo negativo. Este diálogo funciona de manera un poco diferente en las versiones anteriores de Windows, describí la versión de Windows 7.

Cuestiones relacionadas