programing

Python의 무한대 해시에 ?자리가 있는 이유는 무엇입니까?

itsource 2023. 1. 17. 21:31
반응형

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.infPython 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

(PyPy도 같은 결과입니다.)


코드로 말하면, 는 빌트인 함수입니다.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.hfloat와 복소수 해시의 중복을 줄이기 위해 코드를 재정렬하여 트렌트의 초기 시도에서 논리적인 결론을 이끌어냈다.플로트의 해시가 에러가 없어도 -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의 처음 몇 자리 소수점부터 형성된다는 점에 주의해 주십시오.

관련 나중의 커밋:

_PyHASH_INF같은 상수로 정의된다.314159.

나는 이것에 대해 어떠한 논의도 찾을 수 없고, 이유가 있는 코멘트도 찾을 수 없습니다.나는 그것이 다소 자의적으로 선택되었다고 생각한다.다른 해시에 대해 같은 의미 있는 값을 사용하지 않는 한 문제가 되지 않을 것입니다.

실제로.

sys.hash_info.inf

돌아온다314159값은 생성되지 않고 소스 코드에 포함되어 있습니다.실은.

hash(float('-inf'))

-271828python 2에서는 약 -e(지금은 -314159).

역사상 가장 유명한 두 개의 비합리적인 숫자가 해시 값으로 사용된다는 사실은 우연일 가능성이 매우 낮습니다.

언급URL : https://stackoverflow.com/questions/56227419/why-does-pythons-hash-of-infinity-have-the-digits-of-%cf%80

반응형