मैं पायथन के हैश फंक्शन के साथ खेल रहा हूं । छोटे पूर्णांकों के लिए, यह hash(n) == n
हमेशा दिखाई देता है । हालाँकि यह बड़ी संख्या में विस्तारित नहीं होता है:
>>> hash(2**100) == 2**100
False
मुझे आश्चर्य नहीं है, मुझे समझ में हैश मूल्यों की एक सीमित सीमा लेता है। वह सीमा क्या है?
मैंने सबसे छोटी संख्या खोजने के लिए बाइनरी खोज का उपयोग करने की कोशिश कीhash(n) != n
>>> import codejamhelpers # pip install codejamhelpers
>>> help(codejamhelpers.binary_search)
Help on function binary_search in module codejamhelpers.binary_search:
binary_search(f, t)
Given an increasing function :math:`f`, find the greatest non-negative integer :math:`n` such that :math:`f(n) \le t`. If :math:`f(n) > t` for all :math:`n \ge 0`, return None.
>>> f = lambda n: int(hash(n) != n)
>>> n = codejamhelpers.binary_search(f, 0)
>>> hash(n)
2305843009213693950
>>> hash(n+1)
0
2305843009213693951 में क्या खास है? मैंने ध्यान दिया कि यह इससे कम हैsys.maxsize == 9223372036854775807
संपादित करें: मैं Python 3 का उपयोग कर रहा हूं। मैंने Python 2 पर एक ही बाइनरी खोज को चलाया और 2147483648 पर एक अलग परिणाम प्राप्त किया, जो मैंने नोट किया है sys.maxint+1
मैंने [hash(random.random()) for i in range(10**6)]
हैश फ़ंक्शन की सीमा का अनुमान लगाने के लिए भी खेला । अधिकतम लगातार ऊपर n से नीचे है। मिनट की तुलना में, ऐसा लगता है कि पायथन 3 का हैश हमेशा सकारात्मक रूप से मूल्यवान है, जबकि पायथन 2 का हैश नकारात्मक मान ले सकता है।
n+1 == 2**61-1
n
पूरे 64 बिट इंट रेंज के लिए है।
2147483647
के बराबर sys.maxint
(नहीं sys.maxint+1
), और यदि 'एन = 0b1111111111111111111111111111111111111111111111111111111111111' तो नहीं है n+1 == 2**61
या n == 2**61-1
(नहीं n+1 == 2**61-1
)?