Строка C #.GetHashCode() возвращает результат, отличный от int

#c# #.net

#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:                            COMMARCtje
name.GetHashCode().GetType():    System.Int32
name.GetHashCode():              - ?2097695743
name.GetHashCode().ToString():   - ?2097695743

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


Press Enter to continue
  

И это изображение того же результата:

Странное возвращаемое значение GetHashCode

Мой вопрос: как, черт возьми, это возможно?

ОБНОВЛЕНИЕ: проблема заключалась в странных настройках Windows для отрицательных чисел.

Комментарии:

1. Это не так. Я подозреваю, что терминал сошел с ума. (Единственная другая возможность заключается в том, что int.ToString() это неверно, но я сомневаюсь в этом.)

2. Это может быть конфликт культур. Что Name.GetHashCode().ToString(CultureInfo.InvariantCulture) выводит?

3. Можете ли вы добавить это в свое приложение? Консоль. WriteLine(«Культура:» System. Многопоточность. Нитки. currentThread . Текущая культура. toString()); Консоль. WriteLine(«Культура пользовательского интерфейса:» System. Многопоточность. Нитки. currentThread . Текущая культура. toString());

4. @MladenPrajic хэш-код, возвращаемый из GetHashCode, имеет чрезвычайно высокую вероятность коллизий — он не используется для однозначной идентификации данных, А ТОЛЬКО для распределения элементов по сегментам в хэш-наборах. Вы видите сбой, потому что получаете повторяющиеся хэш-коды. Сгенерируйте хэш-коды для всех ваших пользователей и посмотрите, получите ли вы дубликаты.

5. @MladenPrajic — toString() использует языковой стандарт текущего компьютера. Проверьте региональные настройки в панели управления — возможно, в числовом формате есть странный символ.

Ответ №1:

Если это выходные данные на компьютере клиента (но не на вашем или нашем), возможно, на компьютере пользователя Windows специально настроена на использование «- ?» в качестве числового отрицательного символа. Windows вполне готова позволить вам сделать это или любые другие странные форматы.

В качестве теста я только что настроил Windows на своем компьютере на использование «- ?» и запустил простое консольное приложение, подобное вашему, выводящее тупо отформатированные отрицательные числа, как в вашем примере. вывод. Если это так на компьютере вашего клиента, в работе GetHashCode нет ничего плохого, это просто артефакт форматирования Windows.

Комментарии:

1. я отмечу это как ответ, как это было сначала. вы оба правы.

Ответ №2:

Проблема не в GetHashCode(), проблема в Int32 .toString() . Который знает о предпочтениях пользователя для форматирования отрицательных чисел. Панель управления Регион и язык, вкладка Форматы, кнопка дополнительных настроек. Вкладка Numbers, настройка символа отрицательного знака. Этот диалог работает немного по-другому в более ранних версиях Windows, я описал версию Windows 7.