TDictionary를 사용하여 Delphi에서 Car < -> Owner를 구현하면 IEqualityComparer의 Equals 및 GetHashCode 함수를 어떻게 구현해야합니까? (GetHashCode는 TDictionary의 해시에 사용되는 정수를 반환합니다.)TDictionary에 대한 Equals 및 GetHashCode <TVehicle, TPerson>
TVehicle 클래스의 경우 VIN (차량 식별 번호)이 있다고 가정합니다.
VIN의 해시 코드는 어떻게 구현해야합니까?
업데이트 :이 예에서, 객체 ID는 고유하고 불변 ("이 불변에 따라 '두 개의 객체 포인터의 메모리 위치의 정체성',하지만 '같은 개체의 두 인스턴스의 정체성을 의미하지 않는다 ") 속성의 조합.
지도에서 차량의 메모리 주소로 차량을 검색하는 대신 찾고있는 차량이 필요합니다.
응용 프로그램 시작시 사전에로드 된 차량 소유자 데이터가 포함 된 데이터베이스를 생각해보십시오. 이제 사용자가 애플리케이션 양식에 VIN을 입력하면 애플리케이션이 사전에서 차량을 어떻게 찾을 수 있습니까? 코드가 VehicleFactory.CreateVehicleFromDatabase(Edit1.Text);
을 사용하여 새 인스턴스를 만들고 사전에서이 개체를 검색하면 메모리 주소를 찾기 때문에 Equals의 기본 구현은 맵에서 항목을 찾지 않습니다. 차량을 찾으려면 Equals는 VIN을 비교해야합니다.
그래서 사용자 지정 IEqualityComparer를 만들어야합니다. 같음을 구현하는 것은 간단합니다. 그러나 GetHashCode는 어떻습니까? 문자열 속성의 경우 단순히 문자열의 주소를 사용할 수 없습니다 (Berry Kelly Are Delphi strings immutable? : "두 개의 별도 코드 섹션에서 동일한 문자열을 만드는 경우 동일한 백킹 저장소를 공유하지 않습니다"). 따라서 GetHashCode 문자열 속성에 대한 함수는 사용자 정의 된 구현이 필요합니다.
나는 또한 질문 How do I hash a string with Delphi?을 발견 발견 - 가능하면 내가이 일에 KISS 원칙을 던질 거라고 HashValue('Hello World')
문자열의 기본 비교자는 주소를 비교하지 않습니다. –
퍼즐에 누락 된 조각은 문자열에 대한 GetHashCode입니다. Delphi 2009 및 이후 버전에서는 모든 객체에 GetHashCode 메소드가 있습니다. 문자열은 객체가 아니므로 최신 버전의 Delphi에는 시스템 함수가 있어야합니다. – mjn
문자열에는 해시 코드가 있지만 문자열의 주소가 아니라 내용에 기반합니다. Delphi에서 문자열을 해시 할 수 없다는 아이디어는 어디서 얻었습니까? –