시뻘건 개발 도전기

러스트 19 - Collections #2 : Hash Map 본문

프로그래밍/RUST

러스트 19 - Collections #2 : Hash Map

시뻘건볼때기 2019. 3. 31. 22:05
반응형

 

 

개인적으로 많은 Collection 중에 String 다음으로 가장 많이 사용했던 녀석이다.

HashMap<Key, Value> 형식을 가지고 있고 Key와 Value를 매핑시켜 관리하는 데이터 구조가 되겠다.

Key와 Value를 메모리 어디에 저장할지 결정하는 해쉬함수를 통해 동작한다.

 


use std::collections::HashMap;

fn main() {
    // HashMap 정의
    let mut scores = HashMap::new();

    // 값 삽입
    scores.insert(String::from("BLUE"), 1);
    scores.insert(String::from("RED"), 2);

    // #1 전체 출력
    println!("scores : {:?}", scores);

    // #2 특정 값 출력
    println!("===========================");
    println!("BLUE : {:?}", scores.get("BLUE"));
    println!("RED : {:?}", scores.get("RED"));

    // #3 for문을 이용한 접근
    println!("===========================");
    for (key, value) in &scores {
        println!("key : {}", key);
        println!("value : {}", value);
        println!();
    }
}

여기서 기억해야 할 한 가지.

첫 줄에 use 구문이 있다는 것. 이것은 "collections의 HashMap을 가져다 사용할꺼야~"라는 뜻이다.

"그런데 왜 String이나 직전 장에서 다루었던 벡터는 없을까?"라는 의문이 들 지 모르겠다.

이 의문의 답은 다음과 같다.

HashMap은 사용 빈도가 적기 때문에 Prelude에서 자동으로 가져오는 기능에 포함되어 있지 않다.

(사실 어느 분야의 개발인지, 혹은 개발자 성향, 코드 보수 등에 따라서 어떠한 데이터 구조를 사용해야 하는지 사람마다 다를 수 없는데.. 굳이 좋은 기능에서 제외할 필요가 있을까 라는 생각도 문득 든다...)

이 뿐만 아니라, HashMap의 경우에는 표준 라이브러리로부터 지원도 다른 컬렉션에 비해 적은 편이다.(매크로가 없다..)

 

Key와 Value는 각각 같은 타입의 값을 가져야 하며 마찬가지로 힙 영역에 데이터가 쌓인다.

 

HashMap정의에 대해 같은 코드를 소개한다.

    let teams = vec![String::from("BLUE"), String::from("RED")];
    let initial_scores = vec![1, 2];

    let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();

벡터를 이용하여 HashMap을 정의하는 방법이다.

Key가 될 녀석을과 Value가 될 녀석을을 각각 벡터로 선언하고, Iterator를 사용하여 HashMap을 만든다.

zip(Iter<T>)의 경우 Key와 Value를 한 쌍이 되도록 벡터를 생성할 수 있다.

collect()의 경우, 벡터를 HashMap으로 변환할 수 있다.

 


보통 HashMap은 DOS 공격에 저항하기 위해 암호화적으로 보안 이슈로 사용 된다.

이 것은 가장 빠른 해싱 알고리즘이 아니다. 따라서 만약 코드를 프로피일링하여 다른 해시를 지정하면 다른 함수로 전환이 가능하다.(Hasher)

Hasher는 BuildHasher 특성을 구현한 타입을 이야기한다. Hasher의 경우 만들 수는 있겠지만, Crates에서 제공되고 있다.

 

 

 

※ 러스트에서 제공하는 표준 컬렉션 목록

  • BinaryHeap
  • Bound
  • BtreeMap
  • BtreeSet
  • HashMap
  • HashSet
  • LinkedList
  • VecDeque

 

 

반응형

'프로그래밍 > RUST' 카테고리의 다른 글

러스트 21 - 예외처리 #2 : Result<T, E>  (0) 2019.04.14
러스트 20 - 예외처리 #1 : panic!  (0) 2019.04.14
러스트 18 - Collections #1 : Vector  (0) 2019.03.31
러스트 17 - if let  (0) 2019.03.30
러스트 16 - 열거형 #2  (0) 2019.03.24
Comments