title: “주간 팁 #152: AbslHashValue
과 함께”
layout: tips
sidenav: side-nav-tips.html
published: true
permalink: tips/152
type: markdown
order: “152”
—
원래 2018년 6월 21일에 TotW #152로 게시됨
작성자: Matt Kulukundis
2020-04-06 업데이트
빠른 링크: abseil.io/tips/152
“나는 모차르트를 사랑하지만, 종종 엉망으로 연주합니다.”
– 사이먼 래틀
absl::Hash
프레임워크(https://abseil.io/docs/cpp/guides/hash)는 이제 Swisstable 계열 해시 테이블(absl::{flat,node}_hash_{set,map}
)의 기본 해시 구현입니다. 이 프레임워크를 통해 해시 가능한 모든 타입은 Swisstable의 키로 자동으로 사용할 수 있습니다.
어떻게 사용하나요?
다음과 같이 간단한 Song
구조체가 있다고 가정해봅시다. (이 필드들로 노래를 고유하게 식별할 수 있다고 가정합니다.)
struct Song {
std::string name;
std::string artist;
absl::Duration duration;
};
그리고 absl::flat_hash_set<Song>
또는 absl::flat_hash_map<Song, CopyrightOwner>
를 저장하려고 합니다. 이를 위해 간단한 친구 함수(friends function)를 추가하면 됩니다.
struct Song {
std::string name;
std::string artist;
absl::Duration duration;
template <typename H>
friend H AbslHashValue(H h, const Song& s) {
return H::combine(std::move(h), s.name, s.artist, s.duration);
}
// operator == 및 !=의 구현도 포함하세요
};
이렇게 하면 모든 것이 작동합니다!
어떻게 테스트하나요?
absl::VerifyTypeImplementsAbslHashCorrectly
를 사용하여 타입이 적절하게 구현되었는지 확인할 수 있습니다. 이 함수는 몇 가지 요구사항이 있습니다:
-
해당 타입이
==
연산자를 올바르게 구현해야 합니다. -
호출자는 해당 타입의 주요 표현(representations)을 포함하는 인스턴스를 제공해야 합니다. (예: 작은 크기 최적화가 있는 타입의 경우, 작은 크기 최적화가 적용된 인스턴스와 그렇지 않은 인스턴스를 포함해야 합니다.)
TEST(MyType, SupportsAbslHash) {
EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly({
MyType(),
MyType(1, 2),
MyType(2, 3),
MyType(0, 0),
}));
}
absl::VerifyTypeImplementsAbslHashCorrectly
는 이질적인 조회(heterogeneous lookup)와 사용자 정의 동등 연산자(custom equality operators)를 테스트하는 것도 지원합니다.
더 궁금한 점이 있으신가요? 자세한 내용은 여기를 참고하세요!