我正在研究一个要编译为Webassembly的项目。所以我想我必须将库标记为no_std。但是由于它当前非常依赖Vec,String和HashSet,所以当我遇到这些功能的错误时,这似乎是不可能的。
如何删除/替换这些功能,而又不会在no_std环境(如webassembly)中失去功能。我想我可以选择&str而不是String,但是其他的呢?
如果我删除#![cfg_attr(not(test), no_std)]
并编译该项目,则它似乎可以作为Webassembly二进制文件工作。如果添加行时出现错误,为什么会这样呢?
最佳答案
正如评论中提到的那样,您不需要将自己局限于WASM中的no_std
,因为有很多标准库可用,包括这两个集合。
但是,如果您在真实的no_std
环境中进行构建,则可以使用Vec
,前提是您使用alloc
crate ,该 crate 可用于分配内存。 String
同样可用。在大多数情况下,您将有一些可用的内存分配,因此alloc
是一个选项。
您不能在HashMap
环境中使用HashSet
或no_std
,因为要避免散列冲突攻击,它们需要有权访问安全的随机数据源。甚至no_std
环境也可能处理不受信任的数据,因此保留此安全性不变很重要。在这里,您可以改用BTreeMap
和BTreeSet
(也来自alloc
),它们提供相似的功能,但性能特征略有不同,对所讨论的数据的要求也略有不同。由于这些集合是确定性的,因此可以在不超过内存分配器的情况下实现它们。
关于rust - 在no_std环境中,我该如何替换Vec和HashSet?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65469712/