Use bytemuck instead of unsafe Rust
This commit is contained in:
		
							parent
							
								
									59b19eefe3
								
							
						
					
					
						commit
						939d2230d2
					
				
							
								
								
									
										7
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										7
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -23,6 +23,12 @@ version = "2.3.2"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "6dbe3c979c178231552ecba20214a8272df4e09f232a87aef4320cf06539aded"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "bytemuck"
 | 
			
		||||
version = "1.13.1"
 | 
			
		||||
source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
			
		||||
checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"
 | 
			
		||||
 | 
			
		||||
[[package]]
 | 
			
		||||
name = "bytes"
 | 
			
		||||
version = "1.4.0"
 | 
			
		||||
@ -58,6 +64,7 @@ dependencies = [
 | 
			
		||||
name = "gbt"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
dependencies = [
 | 
			
		||||
 "bytemuck",
 | 
			
		||||
 "bytes",
 | 
			
		||||
 "napi",
 | 
			
		||||
 "napi-build",
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,7 @@ bytes = "1.4.0"
 | 
			
		||||
once_cell = "1.18.0"
 | 
			
		||||
napi = { version = "2.13.2", features = ["napi8", "tokio_rt"] }
 | 
			
		||||
napi-derive = "2.13.0"
 | 
			
		||||
bytemuck = "1.13.1"
 | 
			
		||||
 | 
			
		||||
[build-dependencies]
 | 
			
		||||
napi-build = "2.0.1"
 | 
			
		||||
 | 
			
		||||
@ -31,16 +31,16 @@ pub struct U32Hasher(u32);
 | 
			
		||||
impl Hasher for U32Hasher {
 | 
			
		||||
    fn finish(&self) -> u64 {
 | 
			
		||||
        // Safety: Two u32s next to each other will make a u64
 | 
			
		||||
        unsafe { core::mem::transmute::<(u32, u32), u64>((self.0, 0_u32)) }
 | 
			
		||||
        bytemuck::cast([self.0, 0])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn write(&mut self, bytes: &[u8]) {
 | 
			
		||||
        // Assert in debug builds (testing too) that only 4 byte keys (u32, i32, f32, etc.) run
 | 
			
		||||
        debug_assert!(bytes.len() == 4);
 | 
			
		||||
        // Safety: We know that the size of the key is at least 4 bytes
 | 
			
		||||
        // Safety: We know that the size of the key is 4 bytes
 | 
			
		||||
        // We also know that the only way to get an instance of HashMap using this "hasher"
 | 
			
		||||
        // is through the public functions in this module which set the key to u32.
 | 
			
		||||
        self.0 = unsafe { *bytes.as_ptr().cast::<u32>() };
 | 
			
		||||
        // is through the public functions in this module which set the key type to u32.
 | 
			
		||||
        self.0 = *bytemuck::from_bytes(bytes);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user