在 no_std 环境中用什么替换 Vec 和 HashSet?

What do I replace Vec and HashSet with in a no_std environmement?

我正在开发一个要编译为 webassembly 的项目。所以我想我必须将图书馆标记为 no_std。但由于它目前非常依赖 Vec、String 和 HashSet,这似乎是不可能的,因为我遇到了这些功能的错误。

我如何才能 remove/replace 这些功能而不失去 no_std 环境(如 webassembly)中的功能。我想我可以选择 &str 而不是 String,但是其他的呢?

如果我删除 #![cfg_attr(not(test), no_std)] 并编译项目,它似乎可以作为 webassembly 二进制文件工作。为什么会这样,如果我在添加行时出错?

正如评论中提到的那样,您无需将自己限制在 WASM 中 no_std,因为许多标准库都可用,包括这两个集合。

但是,如果您在真实的 no_std 环境中构建,则可以使用 Vec,前提是您使用 alloc crate,它允许您分配内存。 String 同样可用。在大多数情况下,您会有一些可用的内存分配,因此 alloc 是一个选项。

您不能在 no_std 环境中使用 HashMapHashSet,因为要避免哈希冲突攻击,它们需要访问安全的随机数据源。即使 no_std 环境也可能处理不受信任的数据,因此保持这种安全不变性很重要。在那里,您可以改用 BTreeMapBTreeSet(也来自 alloc),它们提供类似的功能,但性能特征略有不同,对相关数据的要求也略有不同。因为这些集合是确定性的,所以只需要一个内存分配器就可以实现它们。