파이썬에서 좋은 __hash__ 함수를 구현하는 방법
아래 장난감 예제와 같이 여러 속성을 가진 클래스를 구현할 때 해싱을 처리하는 가장 좋은 방법은 무엇입니까?
내 생각에 그것은__eq__
그리고.__hash__
일관성이 있어야 하지만 모든 속성을 처리할 수 있는 적절한 해시 함수를 구현하는 방법은 무엇입니까?
class AClass:
def __init__(self):
self.a = None
self.b = None
def __eq__(self, other):
return other and self.a == other.a and self.b == other.b
def __ne__(self, other):
return not self.__eq__(other)
def __hash__(self):
return hash((self.a, self.b))
저는 이 질문에서 튜플은 해시 가능하다고 읽었는데, 위의 예시와 같은 것이 합리적인지 궁금합니다.그런가요?
__hash__
동일한 개체에 대해 동일한 값을 반환해야 합니다.또한 개체의 수명 동안 변경되어서는 안 됩니다. 일반적으로 불변 개체에 대해서만 구현합니다.
간단한 구현은 다음과 같습니다.return 0
이 방법은 항상 올바르지만 성능이 저하됩니다.
여러 속성의 해시를 반환하는 솔루션이 좋습니다.그러나 비교하는 모든 속성을 나열할 필요는 없습니다.__eq__
태플로일반적으로 일부 속성이 부등식 객체에 대해 동일한 값을 갖는 경우에는 제외합니다.해시 계산을 필요 이상으로 비싸게 하지 마십시오.
편집: x 또는 일반적으로 해시를 혼합하지 않는 것이 좋습니다.서로 다른 두 속성의 값이 동일하면 해시가 동일하고 x 또는 x를 사용하면 서로가 취소됩니다.튜플은 해시를 혼합하기 위해 더 복잡한 계산을 사용합니다. 참조tuplehash
…에
다음에 대한 설명서
필요한 유일한 속성은 동일한 해시 값을 비교하는 개체입니다. 개체와 비교하여 역할을 하는 개체 구성 요소의 해시 값을 태플로 패킹하고 태플을 해싱하여 함께 혼합하는 것이 좋습니다.예
def __hash__(self):
return hash((self.name, self.nick, self.color))
글을 쓰는 것은 위험합니다.
def __eq__(self, other):
return other and self.a == other.a and self.b == other.b
왜냐하면 당신의 rh가 (즉,other
) 객체는 부울 False로 평가되며, 절대로 어떤 것과도 동일하게 비교되지 않습니다!
추가로, 당신은 다음의 경우를 다시 확인하는 것이 좋습니다.other
의 클래스 또는 하위 클래스에 속합니다.AClass
그렇지 않으면 예외가 발생합니다.AttributeError
또는 잘못된 양수(다른 클래스에 일치하는 값을 가진 동일한 이름의 속성이 있는 경우).그래서 다시 쓰는 것을 추천합니다.__eq__
다음과 같이:
def __eq__(self, other):
return isinstance(other, self.__class__) and self.a == other.a and self.b == other.b
하는 한 이 없는 비교를 , 속성이로일간클없한비비관는에스으로적유다좋니래습것연사이않경는지하용최원비한도소에우는하한교를련이름별치이정는교하상하는▁least▁avoid▁if▁▁to▁at▁compar▁as▁flexibleison,▁you▁still▁unusually▁classes'다니습좋속dutes▁match▁an,▁which▁compares▁unrelated▁across성▁by▁want▁by것▁you이▁chance않는▁any이▁long▁name▁attrib▁as지름이별로하사용치래AttributeError
그리고 그것을 확인합니다.other
추가 속성이 없습니다.개체의 모든 속성을 찾는 표준 방법이 없기 때문에 상황에 따라 방법이 달라집니다.
언급URL : https://stackoverflow.com/questions/4005318/how-to-implement-a-good-hash-function-in-python
'code' 카테고리의 다른 글
하이픈/대시를 사용한 MariaDB 전체 텍스트 검색 (0) | 2023.07.27 |
---|---|
ASC가 아닌 것을 제거하려면 어떻게 해야 합니까?II 문자는 마침표와 공백을 남깁니다. (0) | 2023.07.22 |
Spring Security oauth2 클라이언트 - Twitter 문제 (0) | 2023.07.22 |
요구사항 사용 방법.txt: 파이썬 프로젝트에 모든 종속성을 설치합니다. (0) | 2023.07.22 |
스프링 데이터 탄력적 검색: 동일한 문서가 있는 다중 인덱스 (0) | 2023.07.22 |