저는 파이썬의 해시 함수를 가지고 놀았습니다 . 작은 정수의 경우 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의 해시는 음의 값을 취할 수 있습니다.
n+1 == 2**61-1
n
전체 64 비트 int 범위에 해당합니다.
2147483647
같지 않습니다 sys.maxint
(아님 sys.maxint+1
), 'n = 0b1111111111111111111111111111111111111111111111111111111111111'이면 같지 n+1 == 2**61
않거나 n == 2**61-1
(아님 n+1 == 2**61-1
)?