আমি পাইথনের হ্যাশ ফাংশন নিয়ে খেলছি । ছোট পূর্ণসংখ্যার জন্য, এটি 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
সম্পাদনা: আমি পাইথন ৩ ব্যবহার করছি আমি পাইথন ২ তে একই বাইনারি অনুসন্ধান চালিয়েছি এবং একটি আলাদা ফলাফল পেয়েছি 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
)?