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 中是稳定的。标准库的 HashMap<K, V> 类型中最大的稳定 API 之一是对自定义哈希算法的支持。以前,所有哈希映射都使用 SipHash 作为哈希算法,这提供了默认的防范 DOS 攻击的保护。然而,SipHash 在哈希小键时速度不是很快。 然而,正如所显示的,对于这些大小的输入,FNV 哈希算法要快得多。这意味着,只要可以接受失去 DOS 保护,通过为 HashMap<usize, V> 之类的类型切换哈希算法,就可以显着提高速度。

要查看实际效果,您可以在 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
  • 用于 FFI 的 CString 的各种改进。
  • 各种数值类型的检查、饱和和溢出运算。这些不计入上面的“40”个数字中,因为它们*很多*,但它们都做同样的事情。

有关更多信息,请参阅详细发行说明

Cargo 功能

Cargo 有一些小的更新:

  • 对构建脚本的改进,使其能够准确地告知 Cargo 关于依赖项的信息,以确保仅在这些文件更改时才重新运行它们。这应该在具有构建脚本的存储库中对开发有很大帮助。
  • cargo rustc 子命令的修改,允许指定配置文件以在测试期间引入开发依赖项等。

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