[Rust 공식문서 한국어 정리] 106. Rust Hash 트레이트 가이드
[Rust 공식문서 한국어 정리] 106. Rust Hash 트레이트 가이드
원문 제목: Trait std::hash::Hash
작성자: The Rust Project
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Hash 트레이트가 제공하는 해시값 계산 메커니즘을 상세히 다룹니다.
HashMap과 HashSet에서 키로 사용하기 위한 요구사항을 학습합니다.
#[derive(Hash)]의 자동 구현과 수동 구현 방법을 정리합니다.
해시 알고리즘의 일관성 요구사항과 Eq와의 관계를 설명합니다.
커스텀 해시 함수와 BuildHasher를 활용하는 방법도 함께 다룹니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① hash 메서드 — Hasher에 상태를 기록하여 해시값 생성
② #[derive(Hash)] — 필드를 순서대로 해싱하는 자동 구현
③ Eq + Hash 계약 — 동등한 값은 동일한 해시를 생성해야 함
④ BuildHasher — HashMap의 해시 알고리즘 교체
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Hash 트레이트는 값을 해시할 수 있음을 나타냅니다.
hash 메서드는 &self와 &mut dyn Hasher를 받아 해시 상태를 갱신합니다.
Hasher 트레이트는 해시 알고리즘의 상태를 추상화합니다.
#[derive(Hash)]를 사용하면 모든 필드가 Hash를 구현한 구조체에 자동으로 Hash가 구현됩니다.
HashMap과 HashSet의 키는 Eq와 Hash를 모두 구현해야 합니다.
Eq + Hash 계약은 a == b이면 hash(a) == hash(b)여야 함을 의미합니다.
이 계약이 깨지면 HashMap의 조회가 실패하거나 잘못된 버킷을 찾게 됩니다.
수동 구현 시 모든 필드를 hasher.write_xxx 메서드로 기록해야 합니다.
해시 충돌은 발생할 수 있으므로 Eq로 최종 동등성을 검증합니다.
Rust의 기본 해시 알고리즘은 Dos 공격에 강한 SipHash 계열을 사용합니다.
성능이 중요한 내부 용도에서는 BuildHasherDefault를 사용하여 faster hash를 적용할 수 있습니다.
FxHashMap 등의 서드파티 해시맵은 더 빠른 해시 알고리즘을 제공합니다.
Hasher의 finish 메서드를 호출하면 최종 해시값인 u64를 얻습니다.
HashMap::with_hasher로 커스텀 해시 빌더를 지정할 수 있습니다.
HashSet도 HashMap과 동일한 해시 메커니즘을 공유합니다.
BTreeMap과 BTreeSet은 Hash 대신 Ord를 요구합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
HashMap 키로 사용할 타입에 #[derive(PartialEq, Eq, Hash)]를 구현합니다.
Eq와 Hash 계약을 지키도록 수동 구현 시 모든 필드를 hasher에 기록합니다.
내부 도구에서는 FxHashMap으로 해시 성능을 향상시킵니다.
보안이 중요한 외부 입력에는 기본 SipHash를 유지합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Hash 트레이트는 HashMap과 HashSet 키 사용의 전제 조건입니다.
Eq와 Hash의 계약은 해시 기반 컬렉션의 정확성을 보장합니다.
#[derive(Hash)]로 자동 구현이 가능하며 해시 알고리즘은 필요시 교체할 수 있습니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/std/hash/trait.Hash.html
Hasher: https://doc.rust-lang.org/std/hash/trait.Hasher.html
#Rust #Hash #Hasher #HashMap #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30