这段代码出现了一个有关从函数返回引用的错误:
fn sha512_256_digest(str: &[u8]) -> &[u8] {
let x = digest::digest(&digest::SHA512_256, str);
x.as_ref()
}
在这里正确的方式是如何返回x的as_ref()值?
这段代码出现了一个有关从函数返回引用的错误:
fn sha512_256_digest(str: &[u8]) -> &[u8] {
let x = digest::digest(&digest::SHA512_256, str);
x.as_ref()
}
在这里正确的方式是如何返回x的as_ref()值?
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();
然而,我建议不要这样隐藏类型。
由于你要返回的值是在函数中创建并拥有的,因此无法返回对它的引用,因为一旦函数结束,它就不存在了。
你必须更改函数以返回一个拥有的值,或者将其参数设置为可变引用 &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>
我不确定你正在使用哪个哈希库,但应该有一种方法可以获取实际的哈希数据(而不是对它的引用)。看着你的代码,这可能是一个类型为[u8; 32]
的值。这就是你想从函数中返回的值。