Вчера я просматривал исходники .net и увидел несколько реализаций GetHashcode с чем-то вроде этого:
(i1 << 5) + i ^ i2
Я понимаю, что делает код и почему. Я хочу знать, почему они использовали (i1 ‹‹ 5) + i вместо (i1 ‹‹ 5) - i.
Большинство фреймворков, которые я видел, используют -i, потому что это эквивалентно умножению на 31, что является простым, но способ Microsoft эквивалентен умножению на 33, которое имеет 11 и 3 в качестве множителей и, следовательно, не является простым.
Есть ли этому известное обоснование? Есть разумные гипотезы?