发布 Rust 1.7

2016年3月2日 · Rust 核心团队

Rust 团队很高兴宣布 Rust 的最新版本 1.7。Rust 是一种系统编程语言,专注于安全、速度和并发。

一如既往,你可以从我们网站的相应页面安装 Rust 1.7,并在 GitHub 上查看 1.7 版本的详细发行说明。此版本合并了大约 1300 个补丁。

1.7 稳定版有什么新特性

此版本主要关注库特性。虽然我们正在为未来的版本准备一些语言特性,但 1.7 的开发周期恰逢假期,这意味着在 GitHub 上评论的时间较少,而与亲人共度的时间较多。

库稳定化

大约有 40 个库函数和方法在 1.7 中达到了稳定状态。其中一个最大的稳定化 API 是对标准库 HashMap<K, V> 类型中自定义哈希算法的支持。以前,所有的哈希映射默认都使用 SipHash 作为哈希算法,这提供了针对 DOS 攻击的保护。然而,SipHash 在对小键进行哈希时速度不是很快。正如所示,FNV 哈希算法对于这些大小的输入要快得多。这意味着,对于像 HashMap<usize, V> 这样的类型,通过切换哈希算法可以显著提高速度,只要 DOS 保护的损失是可以接受的。

要看它的实际应用,你可以在 crates.io 上查看 fnv crate,并通过以下方式创建一个 HashMap

extern crate fnv;

use std::collections::HashMap;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;

type MyHasher = BuildHasherDefault<FnvHasher>;

fn main() {
    let mut map: HashMap<_, _, MyHasher> = HashMap::default();
    map.insert(1, "Hello");
    map.insert(2, ", world!");
    println!("{:?}", map);
}

注意,大多数时候你甚至不需要指定哈希器,因为类型推断会处理好它,所以 HashMap::default() 应该足以让你获得高达 2 倍的哈希速度提升。还值得指出的是,Hash trait 与使用的哈希算法无关,因此插入到哈希映射中的类型不需要进行任何更改即可获得好处!

其他显著改进包括

  • <[T]>::clone_from_slice(),一种将数据从一个切片复制到另一个切片的高效方法。
  • Ipv4AddrIpv6Addr 上的各种便捷方法,例如 is_loopback(),根据 RFC 6890 判断地址是否为环回地址,返回 truefalse
  • CString 的各种改进,用于 FFI。
  • 各种数值类型的 checked、saturated 和 overflowing 操作。这些没有包含在上面的‘40’个里面,因为它们数量很,但它们都做同样的事情。

更多信息请参见详细发行说明

Cargo 特性

Cargo 有一些小的更新

  • 构建脚本的改进,允许它们精确地通知 Cargo 关于依赖项的信息,以确保只有当这些文件更改时才重新运行。这应该有助于在使用构建脚本的仓库中的开发工作。
  • cargo rustc 子命令的修改,允许指定 profiles 以在测试等过程中拉取 dev-dependencies。

1.7 贡献者

共有 144 位个人为 1.7 做出了贡献。非常感谢大家!

  • Aaron Turon
  • Adam Perry
  • Adrian Heine
  • Aidan Hobson Sayers
  • Aleksey Kladov
  • Alexander Lopatin
  • Alex Burka
  • Alex Crichton
  • Ali Clark
  • Amanieu d’Antras
  • Andrea Bedini
  • Andrea Canciani
  • Andre Bogus
  • Andrew Barchuk
  • Andrew Paseltiner
  • angelsl
  • Anton Blanchard
  • arcnmx
  • Ariel Ben-Yehuda
  • arthurprs
  • ashleysommer
  • Barosl Lee
  • Benjamin Herr
  • Björn Steinbrink
  • bors
  • Brandon W Maister
  • Brian Anderson
  • Brian Campbell
  • Carlos E. Garcia
  • Chad Shaffer
  • Corey Farwell
  • Daan Sprenkels
  • Daniel Campbell
  • Daniel Robertson
  • Dave Hodder
  • Dave Huseby
  • dileepb
  • Dirk Gadsden
  • Eduard Burtescu
  • Erick Tryzelaar
  • est31
  • Evan
  • Fabrice Desré
  • fbergr
  • Felix Gruber
  • Felix S. Klock II
  • Florian Hahn
  • Geoff Catlin
  • Geoffrey Thomas
  • Georg Brandl
  • ggomez
  • Gleb Kozyrev
  • Gökhan Karabulut
  • Greg Chapple
  • Guillaume Bonnet
  • Guillaume Gomez
  • Ivan Kozik
  • Jack O’Connor
  • Jeffrey Seyfried
  • Johan Lorenzo
  • Johannes Oertel
  • John Hodge
  • John Kåre Alsaker
  • Jonas Schievink
  • Jonathan Reem
  • Jonathan S
  • Jorge Aparicio
  • Josh Stone
  • Kamal Marhubi
  • Katze
  • Keith Yeung
  • Kenneth Koski
  • Kevin Stock
  • Luke Jones
  • Manish Goregaokar
  • Marc Bowes
  • Marvin Löbel
  • Masood Malekghassemi
  • Matt Brubeck
  • Mátyás Mustoha
  • Michael Huynh
  • Michael Neumann
  • Michael Woerister
  • mitaa
  • mopp
  • Nathan Kleyn
  • Nicholas Mazzuca
  • Nick Cameron
  • Nikita Baksalyar
  • Niko Matsakis
  • NODA, Kai
  • nxnfufunezn
  • Olaf Buddenhagen
  • Oliver ‘ker’ Schneider
  • Oliver Middleton
  • Oliver Schneider
  • Pascal Hertleif
  • Paul Dicker
  • Paul Smith
  • Peter Atashian
  • Peter Kolloch
  • petevine
  • Pierre Krieger
  • Piotr Czarnecki
  • Prayag Verma
  • qpid
  • Ravi Shankar
  • Reeze Xia
  • Richard Bradfield
  • Robin Kruppe
  • rphmeier
  • Ruud van Asseldonk
  • Ryan Thomas
  • Sandeep Datta
  • Scott Olson
  • Scott Whittaker
  • Sean Leffler
  • Sean McArthur
  • Sebastian Hahn
  • Sebastian Wicki
  • Sébastien Marie
  • Seo Sanghyeon
  • Sergey Veselkov
  • Simonas Kazlauskas
  • Simon Sapin
  • Stepan Koltsov
  • Stephan Hügel
  • Steve Klabnik
  • Steven Allen
  • Steven Fackler
  • Tamir Duberstein
  • tgor
  • Thomas Wickham
  • Thomas Winwood
  • Tobias Bucher
  • Toby Scrace
  • Tomasz Miąsko
  • tormol
  • Tshepang Lekhonkhobe
  • Ulrik Sverdrup
  • Vadim Petrochenkov
  • Vincent Esche
  • Vlad Ureche
  • Wangshan Lu
  • Wesley Wiser