Почему Ruby хэширует FixNum n до 2n + 1? - PullRequest
4 голосов
/ 10 февраля 2012

Почему Ruby хеширует целое число от n до 2 * n + 1?

>> [0,1,2,3].each {|x| puts x.hash}
1
3
5
7

Я вижу, что вам не всегда нужны сложные хэши, особенно для простых объектов. Но почему правило «double and add 1» вместо того, чтобы делать то, что делает Python, то есть хешировать целые числа для себя?

>>> map(hash,[0,1,2,3])
[0, 1, 2, 3]

Есть ли причина?

1 Ответ

5 голосов
/ 10 февраля 2012

Целые числа являются объектами, поэтому у них есть object_id.Но существует бесконечное количество целых чисел.Казалось бы, нет места для других объектов.Как Ruby справляется с этим?

10.times{|i| puts i.object_id}

Вывод:

1
3
5
7
9
11
13
15
17
19

Целые числа берут все нечетные object_id, остальные объекты идут между ними, они используют четные числа.Преобразование из object_id (и хэша) в целое число (и наоборот) очень просто: обрежьте самый правый 1 бит (или добавьте его).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...