대부분의 답변은 이것이 다른 플랫폼 때문이라고 제안하지만 더 많은 것이 있습니다. 에서 의 문서object.__hash__(self)
:
기본적 __hash__()
으로 str
, bytes
및
datetime
객체 의 값은 예측할 수없는 임의의 값으로 "염 처리"됩니다. 개별 Python 프로세스 내에서 일정하게 유지되지만 반복되는 Python 호출 간에는 예측할 수 없습니다.
이는 dict 삽입의 최악의 경우 성능 인 O (n²) 복잡성을 악용하는 신중하게 선택한 입력으로 인한 서비스 거부에 대한 보호를 제공하기위한 것입니다. 자세한 내용은
http://www.ocert.org/advisories/ocert-2011-003.html 을 참조하십시오.
해시 값을 변경하면 반복의 순서에 영향을 dicts
, sets
그리고 다른 매핑을. Python은이 순서에 대해 보증 한 적이 없습니다 (일반적으로 32 비트와 64 비트 빌드간에 다릅니다).
동일한 시스템에서 실행하더라도 호출에 따라 다양한 결과가 생성됩니다.
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
동안:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
환경 변수도 참조하십시오 PYTHONHASHSEED
.
이 변수를 설정하지 않거나로 설정하면 , 및 객체 random
의 해시를 시드하는 데 임의의 값이 사용됩니다 .str
bytes
datetime
경우 PYTHONHASHSEED
정수 값으로 설정되어, 그것은 생성 고정 시드로 사용되는 hash()
해시 랜덤 적용 유형에있다.
그 목적은 인터프리터 자체에 대한 자체 테스트와 같이 반복 가능한 해싱을 허용하거나 파이썬 프로세스 클러스터가 해시 값을 공유하도록 허용하는 것입니다.
정수는 범위의 10 진수 여야합니다 [0, 4294967295]
. 값 0
을 지정하면 해시 무작위 화가 비활성화됩니다.
예를 들면 :
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305