Re: Правильный GetHashCode для сравнения byte[] по значению
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.12.16 05:28
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Что не есть умно, так как массив может быть весьма длинным, а GetHashCode служит как раз для быстрой проверки на то что объекты не идентичны. Главное условие GetHashCode -- у одинаковых объектов оно всегда совпадает, а у разных объектов как правило не совпадает (но допуситмы коллизии, то есть может совпадать и у разных объектов).

В общем, верно. Но цель хэшфункции, как правило, как раз в минимизации коллизий.

S>По этому вычислять GetHashCode для массива путем вовлечения всех элементов -- глупо и бессмысленно. Согласны?

В каком-то частном случае — не возражаю. В общем случае — не согласен. Общеупотребимы те способы вычисления хэша массива, которые при отличии даже в одном элементе, имеют тенденцию вычислять разное значение.

S>Т.к. GetHashCode возвращает int, то вовлечь достаточно 4 байта. Так же можно вовлечь длину массива (или 1 байт длины). Это будет и быстро и выполнять свои функции, то есть в большенстве случаев сработает. Согласны?

Могу согласиться лишь в том, что правильным подходом при выборе функции хэша в конкретном случае — является бенчмарк. Но т.к. я не видел бенчмарк для большинства случаев, лично мне сложно судить об этом большинстве.

ЗЫ. При увеличиении вероятности коллизии нелинейным образом возрастает необходимость выполнения сравнения, которое обычно дороже чем вычисление хэша.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.