/ / रूबी ने क्यों फिक्सएनएनम 2 एन + 1 के लिए है? - माणिक, हैश

रुबी हैश फिक्सनम एन 2 एन + 1 क्यों है? - रूबी, हैश

रूबी के पास एक पूर्णांक क्यों है? n सेवा मेरे 2 * n + 1?

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

मैं देख सकता हूँ कि आपको हमेशा "t" की आवश्यकता नहीं हैजटिल हैश, विशेष रूप से सरल वस्तुओं के लिए। लेकिन पायथन जो करता है उसका विरोध करने के लिए "डबल और ऐड 1" नियम क्यों है, जो खुद को हैश करने के लिए है?

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

क्या कोई कारण है?

उत्तर:

जवाब के लिए 5 № 1

पूर्णांक ऑब्जेक्ट हैं, इसलिए उनके पास एक ऑब्जेक्ट_आईडी है। लेकिन पूर्णांकों की एक अनंत संख्या है। लगता है, अन्य वस्तुओं के लिए कोई जगह नहीं है। रूबी इसे कैसे खींचती है?

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

आउटपुट:

1
3
5
7
9
11
13
15
17
19

इंटेगर ने सभी विषम वस्तुएं ले लीं, जो बाकी हैंऑब्जेक्ट बीच में जाते हैं, वे समान संख्याओं का उपयोग करते हैं। ऑब्जेक्ट_आईडी (और हैश) से पूर्णांक (और इसके विपरीत) तक रूपांतरण बहुत आसान है: सबसे सही 1 बिट काटें (या इसे जोड़ें)।