Module scale_info::prelude::hash

1.0.0 · source · []
Expand description

Generic hashing support.

This module provides a generic way to compute the hash of a value. Hashes are most commonly used with HashMap and HashSet.

The simplest way to make a type hashable is to use #[derive(Hash)]:

Examples

use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

#[derive(Hash)]
struct Person {
    id: u32,
    name: String,
    phone: u64,
}

let person1 = Person {
    id: 5,
    name: "Janet".to_string(),
    phone: 555_666_7777,
};
let person2 = Person {
    id: 5,
    name: "Bob".to_string(),
    phone: 555_666_7777,
};

assert!(calculate_hash(&person1) != calculate_hash(&person2));

fn calculate_hash<T: Hash>(t: &T) -> u64 {
    let mut s = DefaultHasher::new();
    t.hash(&mut s);
    s.finish()
}

If you need more control over how a value is hashed, you need to implement the Hash trait:

use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};

struct Person {
    id: u32,
    name: String,
    phone: u64,
}

impl Hash for Person {
    fn hash<H: Hasher>(&self, state: &mut H) {
        self.id.hash(state);
        self.phone.hash(state);
    }
}

let person1 = Person {
    id: 5,
    name: "Janet".to_string(),
    phone: 555_666_7777,
};
let person2 = Person {
    id: 5,
    name: "Bob".to_string(),
    phone: 555_666_7777,
};

assert_eq!(calculate_hash(&person1), calculate_hash(&person2));

fn calculate_hash<T: Hash>(t: &T) -> u64 {
    let mut s = DefaultHasher::new();
    t.hash(&mut s);
    s.finish()
}

Macros

Derive macro generating an impl of the trait Hash.

Structs

Used to create a default BuildHasher instance for types that implement Hasher and Default.

SipHasherDeprecated

An implementation of SipHash 2-4.

Traits

A trait for creating instances of Hasher.

A hashable type.

A trait for hashing an arbitrary stream of bytes.