Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923

GetHashCode from null

15.12.2021, 23:40. Показов 5395. Ответов 30
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я хочу высчитать Hash объекта. Но может быть такое, что в параметр коструктора прилетит null.

Я тут почитал, что он постарается поставить дефотное значение, но ладно, если это для типа int, но для типа object как? Ручками написать 0?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Student
{
    public string Name { get; }
    public string SomeObject { get; }
 
    private readonly int hash;
 
    public Student(string name, object someObject)
    }
        Name = name ?? string.Empty;
        SomeObject = ????????????????????????????????
 
        hash = Name.GetHashCode() ^ SomeObject.GetHashCode();
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2021, 23:40
Ответы с готовыми решениями:

Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на примере показать для чего она нужна. ...

GetHashCode
Как лучше реализовать GetHashCode? using System; public class Person : ICloneable { public readonly string Name; ...

Переопределение GetHashCode
Нужно переопределить метод GetHashCode() так, чтобы для объектов с совпадающими данными возвращать равные значения хэш кодов. Не могу...

30
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
16.12.2021, 01:38
Студворк — интернет-сервис помощи студентам
QuakerRUS, понял, я не увидел про это вопрос. Тогда действительно придется дописывать ?? с магическим числом на любой ссылочный тип перед подсчет суммы хеша.

Добавлено через 36 секунд
limeniye, только распределение это неправильное.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
16.12.2021, 01:42
Цитата Сообщение от limeniye Посмотреть сообщение
на вход куда?
На вход в конструктор Student.

Цитата Сообщение от limeniye Посмотреть сообщение
Так, я понял, лучше старым, проверенным, дедовским способом
Да можно и так, если нужно именно распределение:

C#
1
HashCode.Combine(SomeObject ?? "Null")
Только нужно ли? Мне казалось уникальности достаточно.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
16.12.2021, 01:53  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
limeniye, только распределение это неправильное.
Как это так? VisualStudio сгенерировала. Я, правда, другие свойства поудалял, имею у меня и не класс Student

Добавлено через 3 минуты
Цитата Сообщение от QuakerRUS Посмотреть сообщение
Только нужно ли? Мне казалось уникальности достаточно.
Там же object, вдруг мне прилетит int, не проверять же мне типы "вручную". Думаю с какой-то "солью", всё-таки, самое то.
0
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
16.12.2021, 02:03
limeniye, магические числа 1365913784 и -1521134295 были взяты без учета свойств, которыми обладают входные данные. Мне даже не надо запускать сравнение этой реализации и HashCode, чтобы убедиться, что HashCode на случайном наборе входных данных дает меньше дубликатов хешей. Я не беру в расчет костыль с оператором ??, так как его необходимо использовать в любом случае, если хочется отделить 0 от null.

Если стоит цель получить уникальное число, то хеш - это не уникальное число.
Если стоит цель получить меньше дубликатов хешей, то была использована наивная реализация.

Добавлено через 3 минуты
Кстати, это исходники класса EqualityComparer<T>:
C#
1
2
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public override int GetHashCode([DisallowNull] T obj) => obj?.GetHashCode() ?? 0;
Добавлено через 4 минуты
Достал от сюда:
C#
1
2
3
4
5
else if (type == typeof(string))
{
    // Specialize for string, as EqualityComparer<string>.Default is on the startup path
    result = new GenericEqualityComparer<string>();
}
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
16.12.2021, 02:07  [ТС]
Цитата Сообщение от I2um1 Посмотреть сообщение
магические числа 1365913784 и -1521134295 были взяты без учета свойств, которыми обладают входные данные
тут Вас не понял.

Цитата Сообщение от I2um1 Посмотреть сообщение
Если стоит цель получить ...
По своей сути цель состоит не получить, а "обезопаситься". Мой тип содержит 5 параметров типа object.
На уровне выше я всё котролирую и мне никогда, по идее, в э тот конструктор не попадёт 5 интов с значением 0.

Но я хотел бы, всё же, подпереть потолок осиновым паленом, чтобы он не упал.

Если магическим образом туда попадает int param = 0 в один объкт, а в другой объек null -- эти два объекта будут одинаковыми, в рамках хеша. То есть, по сути, пустой объект и объект заполенный нулями -- едентичны.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
16.12.2021, 02:10
Цитата Сообщение от limeniye Посмотреть сообщение
По своей сути цель состоит не получить, а "обезопаситься". Мой тип содержит 5 параметров типа object.
Можно в расчет хэша еще добавить тип объекта, получаемый через GetType(), тогда по идее можно и костыль с "??" убрать. Нулевой int будет отделен от несуществующего object (если для распределения использовать Combine).
1
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
16.12.2021, 02:14
Цитата Сообщение от limeniye Посмотреть сообщение
тут Вас не понял
C#
1
2
3
4
using System;
 
Console.WriteLine(EqualityComparer<string>.Default.GetHashCode(null));
Console.WriteLine(EqualityComparer<int>.Default.GetHashCode(0));
HashCode и реализация https://www.cyberforum.ru/post15934488.html одинаковые, разница только в выборе магических чисел для складывания суммы хешей. Но реализация HashCode дает лучшее распределение.

Цитата Сообщение от QuakerRUS Посмотреть сообщение
получаемый через GetType()
Тогда это будет противоречить:
Цитата Сообщение от limeniye Посмотреть сообщение
Следовательно два объекта с null -- будут не равны
1
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
16.12.2021, 02:34
Цитата Сообщение от I2um1 Посмотреть сообщение
Тогда это будет противоречить
Только если у объектов будет разный тип.

Добавлено через 17 минут
limeniye, вариант 1:

C#
1
2
3
4
public Student(string name, object someObject, object someObject2)
{
    hash = (name, someObject.GetType(), someObject, someObject2.GetType(), someObject2).GetHashCode();
}
Вариант 2 с распределением:

C#
1
2
3
4
public Student(string name, object someObject, object someObject2)
{
    hash = HashCode.Combine(name, someObject.GetType(), someObject, someObject2.GetType(), someObject2);
}
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
16.12.2021, 02:52  [ТС]
QuakerRUS, первый вариант вообще не понял. Куда Вы указываете элементы через запятую?
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
16.12.2021, 02:53
Цитата Сообщение от limeniye Посмотреть сообщение
Куда Вы указываете элементы через запятую?
В кортеж.
1
16.12.2021, 02:54  [ТС]

Не по теме:

QuakerRUS, изучу

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2021, 02:54
Помогаю со студенческими работами здесь

Equal и GetHashCode
Правильно реализовал базовые методы ? class Person { public int a {get; set;} = 0; public override bool Equals(object obj) ...

Dictionary и GetHashCode
Привет. Нужно сделать для своего типа возможность сохранения в словаре, это по сути идентификатор, состоящий из двух значений Enum и...

Equals и GetHashCode
Помогите сделать пожалуйста Неаккуратная реализация Equals и GetHashCode может приводить к тому, что добавленный в Dictionary или...

GetHashCode - зачем и ее применение?
c# GetHashCode - зачем и ее применение? Для чего данный метод существует и как его творчески можно было бы применять, как вы применяете?

GetType() и GetHashCode() у object
Здравствуйте. После долгих поисков в google ответы не были найдены. Можете пожалуйста объяснить как работают методы GetType() и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru