C#string.GetHashCode()返回非int结果

时间:2011-11-03 21:36:36

标签: c# .net

我的一个客户遇到了应用程序崩溃,我追踪它是由于这个错误/功能我无法解释 WindowsIdentity.GetCurrent()。Name.GetHashCode()返回此字符串: - ?2097695743
是的,那是一个减号,一个空格,一个问号,然后是实际的哈希数。

这是一个显示奇怪行为的简单控制台应用程序的代码。

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();
}

这是文本输出:

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

这是相同输出的图片:

Weird GetHashCode return value

我的问题是:这究竟是怎么回事?

更新:问题在于负数的时髦窗口设置。

2 个答案:

答案 0 :(得分:8)

如果这是客户端计算机上的输出(但不是您或我们的计算机上的输出),用户的计算机可能已经专门配置窗口使用“ - ?”作为数字否定符号。 Windows非常愿意让你这样做,或任何其他奇怪的格式。

作为一项测试,我只是在我的机器上配置了Windows以使用“ - ?”,并运行像您这样的简单控制台应用程序输出傻瓜格式的负数,就像您的示例输出一样。如果在客户端的机器上就是这种情况,那么GetHashCode的操作没有任何问题,它只是Windows格式的一个工件。

答案 1 :(得分:7)

问题不在于GetHashCode(),问题在于Int32.ToString()。知道用户格式化负数的首选项。控制面板+区域和语言,格式选项卡,附加设置按钮。数字选项卡,负号符号设置。这个对话框在早期版本的Windows中有点不同,我描述了Windows 7版本。