Трейт 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")