继 Rust 1.6 实现核心库的稳定之后,最近发布的Rust 1.7 改进并实现了大约40 个库函数& 方法的稳定。此外,Rust 包管理器Cargo 新增两个更好的依赖处理特性。
Rust 1.7 一个最重要的变化是允许使用标准库的HashMap<K, V>
类型自定义哈希算法,而且这些算法可以通过类型推断隐式选取。特别地,在键比较小(比如HashMap<usize, V>
)的情况下,Rust 现在会使用一个新的 FNV 哈希算法进行哈希计算。按照 Rust 开发团队的说法,与使用先前默认的 SipHash 算法相比,这在为比较小的键生成哈希值时会带来 2 倍的性能提升(SipHash 算法在为比较小的键生成哈希值时不是很快)。不过,新的 FNV 哈希计算器不会像 SipHash 那样提供 DOS 攻击保护,因此最好是知道,在哈希初始化时指定希望使用的哈希计算器,可以覆盖推断出的默认哈希计算器:
type MyHasher = BuildHasherDefault<SipHasher>; fn main() { let mut map: HashMap<_, _, MyHasher> = HashMap::default(); ... }
Rust 1.7 带来的其他改进包括:
- <[T]>::clone_from_slice() 提供了一种从一个“切片(Slice)”向另一个切片复制数据的有效方法;
- 一些用于
Ipv4Addr
及Ipv6Addr
处理的便捷方法; - 对 CString 的若干改进;
- 针对各种数值类型的检查、饱和和溢出操作。
Rust 1.7 的一些变化破坏了同先前版本的兼容性,在版本切换之前需要适当地考虑。不过,Rust 核心团队成员 Steve Klabnik表示,他对许多现有的库进行了大量的修复,在绝大多数情况下,这些修复都是微不足道的。还有一个细节,就是 Hacker News 用户 kibwen 分享了 Rust 团队如何评估一项变化可能带来的破坏性影响。据他介绍,他们会使用一个名为 Crater 的工具尝试编译 crates.io 上的所有包,并据此确定有多少包依赖于不可靠的行为。
最后,Rust 1.7 还包含下面一些对 Cargo 的改进:
感兴趣的读者可以阅读发布说明,了解Rust 1.7 的全部变更。
查看英文原文: Rust 1.7 Brings 2x Faster Hashes and New Stable APIs
评论