РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
567 of 1245 menu

Трейт Hash

Трейт Hash позволяет типам вычислять свой хеш с помощью объекта, реализующего трейт Hasher. Единственный метод hash принимает изменяемую ссылку на хешер и передаёт в него данные текущего значения. Трейт Hash используется коллекциями HashMap и HashSet для быстрого поиска по ключу.

Параметром метод hash принимает хешер, реализующий трейт Hasher, в который записываются байты значения.

Синтаксис

trait Hash { fn hash<H: Hasher>(&self, state: &mut H); }

Пример

Давайте вычислим хеш числа 12345 с помощью стандартного хешера DefaultHasher:

use std::hash::{Hash, Hasher}; use std::collections::hash_map::DefaultHasher; fn main() { let mut hasher = DefaultHasher::new(); let num = 12345; num.hash(&mut hasher); let res = hasher.finish(); println!("{}", res); }

Результат выполнения кода:

1722712222302751850

Пример

Давайте реализуем трейт Hash вручную для собственной структуры Point:

use std::hash::{Hash, Hasher}; use std::collections::hash_map::DefaultHasher; #[derive(Debug)] struct Point { x: i32, y: i32, } impl Hash for Point { fn hash<H: Hasher>(&self, state: &mut H) { self.x.hash(state); self.y.hash(state); } } fn main() { let p = Point { x: 1, y: 2 }; let mut hasher = DefaultHasher::new(); p.hash(&mut hasher); let res = hasher.finish(); println!("{}", res); }

Результат выполнения кода:

1359512784276804109

Пример

Давайте используем тип, реализующий трейт Hash, в качестве ключа HashMap:

use std::collections::HashMap; #[derive(Hash, PartialEq, Eq, Debug)] struct Key { id: u32, } fn main() { let mut map = HashMap::new(); map.insert(Key { id: 1 }, "abcde"); map.insert(Key { id: 2 }, "12345"); let res = map.get(&Key { id: 1 }); println!("{:?}", res); }

Результат выполнения кода:

Some("abcde")

Смотрите также

  • трейт PartialEq,
    который позволяет сравнивать значения на равенство
  • трейт Eq,
    который гарантирует полное равенство значений
  • трейт Default,
    который создаёт значение по умолчанию
  • трейт Deref,
    который позволяет разыменовывать значение
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить