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