#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
И это изображение того же результата:
Мой вопрос: как, черт возьми, это возможно?
ОБНОВЛЕНИЕ: проблема заключалась в странных настройках 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.