Trait merkle_light::hash::Hashable [] [src]

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

    fn hash_slice(data: &[Self], state: &mut H)
    where
        Self: Sized
, { ... } }

A hashable type.

Types implementing Hashable are able to be [hash]ed with an instance of [Hasher].

Implementing Hashable

You can derive Hashable with #[derive(Hashable)] if all fields implement Hashable. The resulting hash will be the combination of the values from calling [hash] on each field.

#[macro_use]
extern crate merkle_light_derive;
extern crate merkle_light;

use merkle_light::hash::Hashable;

fn main() {
    #[derive(Hashable)]
    struct Foo {
        name: String,
        country: String,
    }
}

If you need more control over how a value is hashed, you can of course implement the Hashable trait yourself:

extern crate merkle_light;

use merkle_light::hash::Hashable;
use std::hash::Hasher;
use std::collections::hash_map::DefaultHasher;

fn main() {
   struct Person {
       id: u32,
       name: String,
       phone: u64,
   }

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

   let foo = Person{
       id: 1,
       name: String::from("blah"),
       phone: 2,
   };

   let mut hr = DefaultHasher::new();
   foo.hash(&mut hr);
   assert_eq!(hr.finish(), 7101638158313343130)
}

Hashable and Eq

When implementing both Hashable and [Eq], it is important that the following property holds:

k1 == k2 -> hash(k1) == hash(k2)

In other words, if two keys are equal, their hashes must also be equal.

Required Methods

Feeds this value into the given Hasher.

Provided Methods

Feeds a slice of this type into the given Hasher.

Implementations on Foreign Types

impl<H: Hasher> Hashable<H> for u8
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for u16
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for u32
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for u64
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for usize
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for i8
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for i16
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for i32
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for i64
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for isize
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 1]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 2]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 3]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 4]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 5]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 6]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 7]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 8]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 9]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 10]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 11]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 12]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 13]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 14]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 15]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 16]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 17]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 18]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 19]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 20]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 21]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 22]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 23]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 24]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 25]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 26]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 27]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 28]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 29]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 30]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 31]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 32]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 33]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 34]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 35]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 36]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 37]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 38]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 39]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 40]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 41]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 42]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 43]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 44]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 45]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 46]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 47]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 48]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 49]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 50]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 51]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 52]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 53]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 54]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 55]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 56]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 57]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 58]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 59]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 60]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 61]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 62]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 63]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for [u8; 64]
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for Vec<u8>
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for bool
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for char
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for str
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for String
[src]

[src]

[src]

impl<H: Hasher> Hashable<H> for ()
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z> + ?Sized> Hashable<Z> for (A,) where
    A: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z> + ?Sized> Hashable<Z> for (A, B) where
    B: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C) where
    C: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D) where
    D: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E) where
    E: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F) where
    F: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z>, G: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F, G) where
    G: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z>, G: Hashable<Z>, H: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F, G, H) where
    H: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z>, G: Hashable<Z>, H: Hashable<Z>, I: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F, G, H, I) where
    I: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z>, G: Hashable<Z>, H: Hashable<Z>, I: Hashable<Z>, J: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F, G, H, I, J) where
    J: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z>, G: Hashable<Z>, H: Hashable<Z>, I: Hashable<Z>, J: Hashable<Z>, K: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F, G, H, I, J, K) where
    K: , 
[src]

[src]

[src]

impl<Z: Hasher, A: Hashable<Z>, B: Hashable<Z>, C: Hashable<Z>, D: Hashable<Z>, E: Hashable<Z>, F: Hashable<Z>, G: Hashable<Z>, H: Hashable<Z>, I: Hashable<Z>, J: Hashable<Z>, K: Hashable<Z>, L: Hashable<Z> + ?Sized> Hashable<Z> for (A, B, C, D, E, F, G, H, I, J, K, L) where
    L: , 
[src]

[src]

[src]

impl<H: Hasher, T: Hashable<H>> Hashable<H> for [T]
[src]

[src]

[src]

impl<'a, H: Hasher, T: ?Sized + Hashable<H>> Hashable<H> for &'a T
[src]

[src]

[src]

impl<'a, H: Hasher, T: ?Sized + Hashable<H>> Hashable<H> for &'a mut T
[src]

[src]

[src]

impl<H: Hasher, T: ?Sized> Hashable<H> for *const T
[src]

[src]

[src]

impl<H: Hasher, T: ?Sized> Hashable<H> for *mut T
[src]

[src]

[src]

Implementors