ฉันได้รับเล่นกับงูหลามของฟังก์ชันแฮช สำหรับจำนวนเต็มขนาดเล็กจะปรากฏ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 ด้านบนอย่างต่อเนื่อง เมื่อเปรียบเทียบค่าต่ำสุดดูเหมือนว่าแฮชของ Python 3 จะมีมูลค่าเป็นบวกเสมอในขณะที่แฮชของ Python 2 สามารถรับค่าลบได้