Python의 무한대 해시에 ?자리가 있는 이유는 무엇입니까?
Python의 무한대 해시는 pi와 일치하는 숫자를 가집니다.
>>> inf = float('inf')
>>> hash(inf)
314159
>>> int(math.pi*1e5)
314159
그냥 우연의 일치인가요, 아니면 의도적인 건가요?
요약:.우연이 아닙니다; Python의 기본 구현에서는 314159로 하드코딩되어 있으며, 2000년에 Tim Peters에 의해 임의의 값(분명히 ) 자리수에서)으로 선택되었습니다.
「」의 값hash(float('inf'))
는 수치형 내장 해시함수의 시스템에 의존하는 파라미터의 1개이며, 다음과 같이 사용할 수도 있습니다.sys.hash_info.inf
Python 3 의 python :
>>> import sys
>>> sys.hash_info
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003, algorithm='siphash24', hash_bits=64, seed_bits=128, cutoff=0)
>>> sys.hash_info.inf
314159
코드로 말하면, 는 빌트인 함수입니다.Python float 오브젝트에서 호출하면 내장된 float 타입의 Atribut에 의해 포인터가 주어지는 함수가 호출됩니다.PyTypeObject PyFloat_Type
), 즉,float_hash
함수, 정의return _Py_HashDouble(v->ob_fval)
그 결과,
if (Py_IS_INFINITY(v))
return v > 0 ? _PyHASH_INF : -_PyHASH_INF;
서 ''는_PyHASH_INF
는 314159 로 정의됩니다.
#define _PyHASH_INF 314159
제일 은 '아주머니'입니다.314159
이에서 (은 Python에서 수 )git bisect
★★★★★★★★★★★★★★★★★」git log -S 314159 -p
)는 2000년8월에 Tim Peters에 의해 추가되어 현재는 commit 39dce293으로 되어 있습니다.cpython
repositorygit repository git git git 。
커밋 메시지는 다음과 같습니다.
http://sourceforge.net/bugs/ ? func = bug & bug _ id = 111866 & group _ id = 5470 을 수정합니다.이것은 오해의 소지가 있는 버그입니다.진정한 "버그"는
hash(x)
을 실시했습니다.x
무궁무진합니다.그걸 고쳤어요. ★★★★★★★★★★★★Py_IS_INFINITY
에서 to macro macro macro macro macro macro macro로.pyport.h
float와 복소수 해시의 중복을 줄이기 위해 코드를 재정렬하여 트렌트의 초기 시도에서 논리적인 결론을 이끌어냈다.플로트의 해시가 에러가 없어도 -1을 반환할 수 있는 매우 드문 버그를 수정했습니다(테스트 케이스를 작성하는데 시간을 허비하지 않고 코드만 보면 알 수 있습니다).복잡한 해시를 개선하여hash(complex(x, y))
하지 않다hash(complex(y, x))
★★★★★★★★★★★★★★★★★★.
특히, 이 커밋에서 그는 그 코드를 제거했다.static long float_hash(PyFloatObject *v)
Objects/floatobject.c
그것을 ...return _Py_HashDouble(v->ob_fval);
의 「」의 「」에서는, 「 」를 참조해 주세요.long _Py_HashDouble(double v)
Objects/object.c
그는 이렇게 덧붙였다.
if (Py_IS_INFINITY(intpart))
/* can't convert to long int -- arbitrary */
v = v < 0 ? -271828.0 : 314159.0;
그래서 언급했듯이, 그것은 자의적인 선택이었다.271828은 e의 처음 몇 자리 소수점부터 형성된다는 점에 주의해 주십시오.
관련 나중의 커밋:
2010년 4월 Mark Dickinson에 의해 (또한)
Decimal
행동하다Mark Dickinson의 2010년 4월 (또한)에 의해 이 체크가 선두로 이동하고 테스트 케이스가 추가되었습니다.
Mark Dickinson은 2010년 5월호 8188에서 해시 함수를 현재 구현으로 완전히 수정했지만, 이 특별한 경우를 유지하여 상수에 이름을 붙였습니다.
_PyHASH_INF
(또한 Python 3에서는 271828을 삭제합니다).hash(float('-inf'))
돌아온다-314159
보다는-271828
Python 2)에서와 같이 동작합니다.2011년 1월 Raymond Hettinger가 Python 3.2의 "What's new"에 명시적인 예를 추가했습니다.
sys.hash_info
위의 값을 나타냅니다.(여기를 참조).Stefan Krah가 2012년 3월에 Decimal 모듈을 수정했지만 이 해시는 그대로 유지했습니다.
2013년 11월 Christian Heimes에 의해, 다음과 같은 정의가 변경되었습니다.
_PyHASH_INF
부터Include/pyport.h
로.Include/pyhash.h
지금 살고 있는 곳으로요
_PyHASH_INF
와 같은 상수로 정의된다.314159
.
나는 이것에 대해 어떠한 논의도 찾을 수 없고, 이유가 있는 코멘트도 찾을 수 없습니다.나는 그것이 다소 자의적으로 선택되었다고 생각한다.다른 해시에 대해 같은 의미 있는 값을 사용하지 않는 한 문제가 되지 않을 것입니다.
실제로.
sys.hash_info.inf
돌아온다314159
값은 생성되지 않고 소스 코드에 포함되어 있습니다.실은.
hash(float('-inf'))
-271828
python 2에서는 약 -e(지금은 -314159).
역사상 가장 유명한 두 개의 비합리적인 숫자가 해시 값으로 사용된다는 사실은 우연일 가능성이 매우 낮습니다.
언급URL : https://stackoverflow.com/questions/56227419/why-does-pythons-hash-of-infinity-have-the-digits-of-%cf%80
'programing' 카테고리의 다른 글
org.w3c.dom을 로드하려면 어떻게 해야 하나요?XML에서 문자열로 문서를 작성하시겠습니까? (0) | 2023.01.17 |
---|---|
yaml: 행 8: 예상된 키를 찾을 수 없습니다. (0) | 2023.01.17 |
대소문자를 구분하지 않는 어레이 검색 (0) | 2023.01.17 |
React의 이벤트 개체에서 사용자 지정 특성에 액세스하는 방법은 무엇입니까? (0) | 2023.01.17 |
MySQL AVG 함수가 예상보다 많은 십진수를 제공함 (0) | 2023.01.17 |