hash as unsafe bytes

This commit is contained in:
Daniel Olsen 2021-05-17 00:47:09 +02:00
parent 3ebfa35fa3
commit 47610129ff
2 changed files with 16 additions and 4 deletions

View File

@ -1,4 +1,4 @@
use std::{hash::Hash, ops::{Deref, DerefMut}}; use std::{hash::{Hash, Hasher}, ops::{Deref, DerefMut}};
use rand::prelude::*; use rand::prelude::*;
use rand::distributions::WeightedIndex; use rand::distributions::WeightedIndex;
//use smallvec::{SmallVec, smallvec}; //use smallvec::{SmallVec, smallvec};
@ -402,8 +402,8 @@ impl Board {
} }
} }
//#[repr(align(16))] #[repr(packed)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Game { pub struct Game {
turn: u32, turn: u32,
player: u8, player: u8,
@ -660,6 +660,18 @@ impl Game {
} }
} }
unsafe fn any_as_u8_slice<T: Sized>(p: &T) -> &[u8] {
::std::slice::from_raw_parts(
(p as *const T) as *const u8,
::std::mem::size_of::<T>(),
)
}
impl Hash for Game {
fn hash<H: Hasher>(&self, state: &mut H) {
unsafe{any_as_u8_slice(self).deref().hash(state)}
}
}
// Tests // Tests

View File

@ -91,7 +91,7 @@ fn calculate_options() -> Result<(), &'static str> {
Ok(()) Ok(())
} }
#[cached(size=45_000_000, key = "Game", convert = r#"{ _game }"#)] #[cached(size=10_000_000, key = "Game", convert = r#"{ _game }"#)]
fn count_options(_game: Game, depth: u8, treshold: u8) -> u128 { fn count_options(_game: Game, depth: u8, treshold: u8) -> u128 {
let before = std::time::Instant::now(); let before = std::time::Instant::now();