Операция смещения битов .Net GetHashcode

Вчера я просматривал некоторые исходники .net и видел несколько реализаций GetHashcode с чем-то вроде это:

(i1 << 5) + i ^ i2

Я понимаю, что делает код и почему. Я хочу знать, почему они использовали (i1 << 5) + i вместо (i1 << 5) - i.

Большинство фреймворков, которые я видел, используют -i, потому что это эквивалентно умножению на 31, которое является простым числом, но способ Microsoft эквивалентен умножению на 33, у которого есть множители 11 и 3.

Есть ли известное оправдание для этого? Какие-нибудь разумные гипотезы?

12
задан D. Patrick 10 August 2011 в 15:19
поделиться