获取各种 Stack 和 Boxed 类型的切片

问题描述 投票:0回答:2

我正在处理一些数据结构,这些数据结构需要一些数据具有顺序(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 结构交互?

rust hash heap-memory slice
2个回答
0
投票

你所描述的

Hash
特质。你应该在这种情况下使用它。您可以将
Hash
与实现
Hasher
特征的任何哈希函数一起使用,因此如果您想使用不同的哈希函数,您只需要
Hasher
的不同实现者。


0
投票

由于结构的 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
特性。

© www.soinside.com 2019 - 2024. All rights reserved.