返回当前函数所拥有数据的引用值

7

这段代码出现了一个有关从函数返回引用的错误:

fn sha512_256_digest(str: &[u8]) -> &[u8] {
    let x = digest::digest(&digest::SHA512_256, str);
    x.as_ref()
}

在这里正确的方式是如何返回xas_ref()值?


3
"我理解为什么会返回错误。" 你能在你的帖子中引用这句话吗?这可以帮助未来的用户找到它。 - underscore_d
3个回答

7
简短回答:你不可能。这是因为digest()返回一个拥有的值,而as_ref()(根据定义)从中借用。当函数返回时,digest()返回值所拥有的内存被销毁,由as_ref()返回的引用变得无效。
我猜测你的目标是隐藏实现细节,即digest()返回一个GenericArray,而你只需要一个&[u8]。你可以通过隐藏具体类型来获得类似的东西:
fn sha512_256_digest(str: &[u8]) -> impl AsRef<[u8]> {
    digest::digest(&digest::SHA512_256, str)
}

......应该能正常工作。函数签名表明,返回值将是某个匿名类型,调用者只能知道它可以像&[u8]一样引用。调用者可以执行以下操作:

// `d` is of some anonymous type
let d = sha512_256_digest(...);

// `db` is a &[u8]
let db = d.as_ref();

然而,我建议不要这样隐藏类型。


6

由于你要返回的值是在函数中创建并拥有的,因此无法返回对它的引用,因为一旦函数结束,它就不存在了。

你必须更改函数以返回一个拥有的值,或者将其参数设置为可变引用 &mut [u8] 并删除返回值 - 因此你的函数签名选择可能是以下之一:

fn sha512_256_digest(str: &mut [u8])

或者

fn sha512_256_digest(str: &[u8]) -> Vec<u8>

使用前者的完整示例如下:

let mut x = <insert your byte array here>;
sha512_256_digest(&mut x);
<use x here>

一个完整的例子如下:
let x = <insert your byte array here>;
let y = sha512_256_digest(&x);
<use y here>

0

我不确定你正在使用哪个哈希库,但应该有一种方法可以获取实际的哈希数据(而不是对它的引用)。看着你的代码,这可能是一个类型为[u8; 32]的值。这就是你想从函数中返回的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接