我正在处理一些数据结构,这些数据结构需要一些数据具有顺序(AVL),而不是必须强制用户实现像
.hash()
这样的方法我想使用Blake3哈希。
问题是哈希器需要一片 u8 才能工作。
我发现这个函数可以给我所需的切片
unsafe fn as_u8_slice<T: Sized>(p: &T) -> &[u8] {
core::slice::from_raw_parts(
(p as *const T) as *const u8,
core::mem::size_of::<T>()
)
}
我从堆栈溢出问题中得到这段代码,但我找不到链接:(
这项工作完全像我想要的
stack
只有变量,但是对于像字符串这样的Box
元素,这个函数给我一个字符串的“元数据”而不是内容的切片。有没有一种方法可以让“通用”函数从使用它的数据类型的堆数据中获取一部分。
它如何与 Boxed 结构交互?
由于结构的 layout 实际上是一个实现细节,除了它提供的特性之外,你不能依赖任何东西。所以,如果你想从类型
T
的参数中得到一些行为,你需要绑定具有以下类型的特征:
fn do_smth<T: AsRef<[u8]>>(p: &T) {
let slice: &[u8] = p.as_ref();
}
AsRef<[u8]>
的变量。以同样的方式,您可能需要 AVL 树的元素的一些行为,如下所示:
pub struct AVLTree<T> {
root: Box<Node<T>>
}
impl<T: Ord + Hash> AVLTree<T> {
pub fn insert(&mut self, val: T) {
// may call val.cmp() and hash methods
}
}
很难通过
&[u8]
实现通用哈希,因为存在稀疏的数据类型(链表,或Box<Box<Box<...>>>
)。但是可以为这些类型实现 Hash
特性。