Понятно, что любые коллизии в реализации Word.GetHashCode()
приведут к коллизии в реализации (int) Word.GetHashCode() * 7
, потому что умножение одинаковых чисел дает одинаковые результаты.
Более интересный вопрос заключается в том, приведут ли неконфликтующие хеш-коды из первой реализации к коллизиям во второй реализации. Оказывается, ответ «нет», потому что диапазоны int
и 7
являются взаимно простыми числами. Следовательно, умножение создает уникальное отображение после удаления переполнения.
Вы можете запустить небольшой тест с двухбайтовыми хэш-кодами, чтобы увидеть, что произойдет:
const int Max = 1<<16;
var count = new int[Max];
for (int i = 0 ; i != Max ; i++) {
count[(i * 7) & (Max-1)]++;
}
var notOne = 0;
for (int i = 0 ; i != Max ; i++) {
if (count[i] != 1) {
notOne++;
}
}
Console.WriteLine("Count of duplicate mappings found: {0}", notOne);
Эта программа сопоставляет i
, значение хеш-кода, с 7 * i
по модулю 216 и проверяет, что каждое число из диапазона создается ровно один раз.
Count of duplicate mappings found: 0
Демо.
Если вы замените 7
четным числом, результат будет совсем другим. Теперь несколько хэш-кодов из исходного набора будут сопоставлены с одним хэш-кодом в целевом наборе. Вы можете понять это интуитивно, если вспомните, что умножение на четное число всегда делает младший бит равным нулю. Следовательно, часть информации теряется в зависимости от того, сколько раз четное число можно разделить на два.
какая из них лучше?
Нет никакой разницы.
Примечание. Вышеприведенное предполагает, что вы игнорируете целочисленное переполнение.
person
Sergey Kalinichenko
schedule
29.09.2016
Word.GetHashCode()
по-прежнему будут сталкиваться после умножения на 7. Также приведение не имеет смысла. - person juharr   schedule 29.09.2016World.GetHashCode()
дает 6 для worldA и worldB, тоWorld.GetHashCode() * 7
дает 42 как для worldA, так и для worldB... - person D. Ben Knoble   schedule 29.09.2016(3 * 7) == (3 * 7)
совпадает с3 == 3
? - person 15ee8f99-57ff-4f92-890c-b56153   schedule 29.09.2016unchecked
). Подробности смотрите в ответе Даса. - person Servy   schedule 29.09.2016