Rust 程序设计语言 简体中文版 1.85.0
guess).expect("Failed to read line"); 不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法 调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。 之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型为 Result 的值。Result 是一种枚举类型,通常也写作 从分配器总共获取了多少 字节的内存。长度与容量的区别是很重要的,不过在当前上下文中并不重要,所以现在可以忽 略容量。 当我们将 s1 赋值给 s2,String 的数据被复制了,这意味着我们从栈上拷贝了它的指针、长 度和容量。我们并没有复制指针指向的堆上数据。换句话说,内存中数据的表现如图 4-2 所 示。 72/562Rust 程序设计语言 简体中文版 s1 name value ptr len 5 ,应当在声明时 使用 pub mod 替代 mod。为了使一个公用模块内部的成员公用,应当在声明前使用pub。 • use 关键字: 在一个作用域内,use关键字创建了一个项的快捷方式,用来减少长路径的重 复。在任何可以引用 crate::garden::vegetables::Asparagus 的作用域,你可以通过 use crate::garden::vegetables::Asparagus;0 码力 | 562 页 | 3.23 MB | 8 天前3简谈 Rust 与国密 TLS - 王江桐
证码生成及验证、随机数生成、 密钥扩充 Sm4 GM/T 0002-2012 ISO/IEC WD1 18033- 3/AMD2 分组加解密 分组加 密 128 AES128,但 是更多次轮询 是 TLCP、消息加解密,用于替代 DES/AES 等国际算法 Sm7 / 分组加解密 分组加 密 128 否,仅以 IP 核的形 式存在于芯片中 卡证类、票务类、支付与通卡类 应用 Introduction of SM1 Rust China Conf 2022 – 2023, Shanghai, China • SM1 是分组加密算法,实现对称加密,分组长度和密钥长度都为 128 位,对长消息进行加解密时, 若消息长度过长,需要进行分组,如果消息长度不足,则要进行填充。 • 保证数据机密性。 • 算法安全保密强度及相关软硬件实现性能与 AES 相当,该算法不公开,仅以 IP 核的形式存在于芯片 Shanghai, China • SM4 为无线局域网标准,是分组加密算法,实现对称加密,用于替代 DES/AES 等国际算法, SM4 算法与 AES 算法具有相同的密钥长度和分组长度,均为 128 位。对长消息进行加解密 时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。 • 加密算法与密钥扩展算法都采用 32 轮非线性迭代结构,解密算法与加密算法的结构相同,只 是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。0 码力 | 44 页 | 3.70 MB | 1 年前3Comprehensive Rust(简体中文) 202412
C++ 不同,在 C++ 中为引用赋值会更改引用的值。 • 共享引用不允许修改其所引用的值,即使该值是可变的。请尝试*r = 'X'。 • Rust 会跟踪所有引用的生命周期,以确保它们存在足够长的时间。在安全的 Rust 中不会出现悬空 引用。x_axis 会返回对 point 的引用,但 point 会在该函数返回时取消分配,因此不会进行编 译。 • 我们会在讲到所有权(ownership)时详细讨论借用(borrow)。 }"); println!("{dog:?}"); } • 在上述示例中,Highlight 注释会强制包含 &str 的底层数据的生命周期至少与使用该数据的 任何 Highlight 实例一样长。 • 如果 text 在 fox(或 dog)的生命周期结束前被消耗,借用检查器将抛出一个错误。 • 借用数据的类型会迫使用户保留原始数据。这对于创建轻量级视图很有用,但通常会使它们更难使 用。 I/O 任务。 Rust 的异步操作基于 ”Futures” 来实现,即表示未来可能完成的工作。系统会对这些 Future 进行“轮 询”,直到显示全部已完成。 由异步运行时对这些 Future 进行轮询,并且有多种不同的运行时可供选择。 比较 • Python 的 asyncio 中也有类似的模型。不过,其 Future 类型基于回调的实现方式,而非通过轮 询。使用异步 Python 程序需要类似于0 码力 | 359 页 | 1.33 MB | 10 月前3Hello 算法 1.0.0 Rust版
基于数组实现的数据结构也称“静态数据结构”,这意味着此类数据结构在初始化后长度不可变。相对应地, 基于链表实现的数据结构也称“动态数据结构”,这类数据结构在初始化后,仍可以在程序运行过程中对其长 度进行调整。 � 如果你感觉物理结构理解起来有困难,建议先阅读下一章,然后再回顾本节内容。 3.2 基本数据类型 当谈及计算机中的数据时,我们会想到文本、图片、视频、语音、3D 模型等各种形式。尽管这些数据的组织 异或满足交换律,因此加法哈希和异或哈希无法区分内容相同但顺序不同的字符串,这可能会加剧哈希冲突, 并引起一些安全问题。 在实际中,我们通常会用一些标准哈希算法,例如 MD5、SHA‑1、SHA‑2 和 SHA‑3 等。它们可以将任意长 度的输入数据映射到恒定长度的哈希值。 近一个世纪以来,哈希算法处在不断升级与优化的过程中。一部分研究人员努力提升哈希算法的性能,另一 部分研究人员和黑客则致力于寻找哈希算法的安全性问题。表 6‑2 的实现开销更低、计算效率更高,但目前使用覆盖度不如 SHA‑2 系列。 表 6‑2 常见的哈希算法 MD5 SHA‑1 SHA‑2 SHA‑3 推出时 间 1992 1995 2002 2008 输出长 度 128 bit 160 bit 256/512 bit 224/256/384/512 bit 哈希冲 突 较多 较多 很少 很少 安全等 级 低,已被成功攻击 低,已被成功攻0 码力 | 383 页 | 17.61 MB | 1 年前3Hello 算法 1.1.0 Rust版
异或满足交换律,因此加法哈希和异或哈希无法区分内容相同但顺序不同的字符串,这可能会加剧哈希冲突, 并引起一些安全问题。 在实际中,我们通常会用一些标准哈希算法,例如 MD5、SHA‑1、SHA‑2 和 SHA‑3 等。它们可以将任意长 度的输入数据映射到恒定长度的哈希值。 近一个世纪以来,哈希算法处在不断升级与优化的过程中。一部分研究人员努力提升哈希算法的性能,另一 部分研究人员和黑客则致力于寻找哈希算法的安全性问题。表 6‑2 的实现开销更低、计算效率更高,但目前使用覆盖度不如 SHA‑2 系列。 表 6‑2 常见的哈希算法 MD5 SHA‑1 SHA‑2 SHA‑3 推出时 间 1992 1995 2002 2008 输出长 度 128 bit 160 bit 256/512 bit 224/256/384/512 bit 哈希冲 突 较多 较多 很少 很少 安全等 级 低,已被成功攻击 低,已被成功攻 较小时,?2 和 ? log ? 的数值比较接近,复杂度不 占主导地位,每轮中的单元操作数量起到决定性作用。 实际上,许多编程语言(例如 Java)的内置排序函数采用了插入排序,大致思路为:对于长数组,采用基于 分治策略的排序算法,例如快速排序;对于短数组,直接使用插入排序。 虽然冒泡排序、选择排序和插入排序的时间复杂度都为 ?(?2) ,但在实际情况中,插入排序的使用频率显 著高于冒泡排序和选择排序,主要有以下原因。0 码力 | 388 页 | 18.50 MB | 1 年前3Hello 算法 1.2.0 简体中文 Rust 版
异或满足交换律,因此加法哈希和异或哈希无法区分内容相同但顺序不同的字符串,这可能会加剧哈希冲突, 并引起一些安全问题。 在实际中,我们通常会用一些标准哈希算法,例如 MD5、SHA‑1、SHA‑2 和 SHA‑3 等。它们可以将任意长 度的输入数据映射到恒定长度的哈希值。 近一个世纪以来,哈希算法处在不断升级与优化的过程中。一部分研究人员努力提升哈希算法的性能,另一 部分研究人员和黑客则致力于寻找哈希算法的安全性问题。表 6‑2 的实现开销更低、计算效率更高,但目前使用覆盖度不如 SHA‑2 系列。 表 6‑2 常见的哈希算法 MD5 SHA‑1 SHA‑2 SHA‑3 推出时 间 1992 1995 2002 2008 输出长 度 128 bit 160 bit 256/512 bit 224/256/384/512 bit 哈希冲 突 较多 较多 很少 很少 安全等 级 低,已被成功攻击 低,已被成功攻 较小时,?2 和 ? log ? 的数值比较接近,复杂度不 占主导地位,每轮中的单元操作数量起到决定性作用。 实际上,许多编程语言(例如 Java)的内置排序函数采用了插入排序,大致思路为:对于长数组,采用基于 分治策略的排序算法,例如快速排序;对于短数组,直接使用插入排序。 虽然冒泡排序、选择排序和插入排序的时间复杂度都为 ?(?2) ,但在实际情况中,插入排序的使用频率显 著高于冒泡排序和选择排序,主要有以下原因。0 码力 | 387 页 | 18.51 MB | 9 月前3Rust 程序设计语言简体中文版
--release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更 快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一 种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新 构建,并且希望程序运行得越快越好。如果你在测试代码的运行时间,请确保运行 guess).expect("Failed to read line"); 不过,过长的代码行难以阅读,所以最好拆开来写。通常来说,当使用 .method_name() 语法 调用方法时引入换行符和空格将长的代码行拆开是明智的。现在来看看这行代码干了什么。 之前提到了 read_line 会将用户输入附加到传递给它的字符串中,不过它也会返回一个类型 为 Result 的值。 Result 是一种枚举类型,通常也写作 len); } fn calculate_length(s: String) -> (String, usize) { let length = s.len(); // len() 返回字符串的长度 (s, length) } 示例 4-5: 返回参数的所有权 但是这未免有些形式主义,而且这种场景应该很常见。幸运的是,Rust 对此提供了一个不用 获取所有权就可以使用值的功能,叫做0 码力 | 600 页 | 12.99 MB | 1 年前3Rust 语言学习笔记
了这份学习 笔记。这份学习笔记的主要贡献在于涵盖了所有工程上基于 Rust 进行开发需要 掌握的基础知识,并且重新调整了目录结构。 我个人对 Rust 语言设计的看法主要是:重大创新,却又博采众长。 Rust 为了解决内存安全问题重新设计了类型系统,提出了所有权的概念,同时 为了能够解决当前大多数语言无法检测到的运行时错误,rust 创造性地设计了 无畏并发。Rust 借鉴了很多优秀语言的设计理念,以及快速迭代的社区,这些 'a ⊆ ('a ∩ 'b) //不成立 很显然,上面我们根本没法保证成立。 所以,这种情况下,我们可以显式地告诉编译器'b 比'a 长('a 是'b 的子集), 只需要在定义 Lifetime 的时候, 在'b 的后面加上: 'a, 意思是'b 比'a 长,'a 是'b 的子集: fn foo<'a, 'b: 'a>(x: &'a str, y: &'b str) -> &'a str { lifetime specifier [E0106]:2 age: &str, 之所以会报错,这是因为 Rust 要确保 Person 的 Lifetime 不会比它的 age 借用 长,不然会出现 Dangling Pointer 的严重内存问题。而在结构体中我们又没有 进行指定。所以我们需要为 age 借用声明 Lifetime: struct Person<'a> { 0 码力 | 117 页 | 2.24 MB | 1 年前3Rust API可靠性分析与验证
Conf 2021 – 2022, Online, China RULF:模糊测试用例程序生成 带有剪枝 的BFS 生成API调用序列 反向搜索 合并与优 化 模糊测试用例程序 短序列 长序列 最优序列 集合 合并 优化 构建API依赖图 合成合法的测试 函数 Rust库源代码 泛型函数 单态化 所有权检查 开源于https://github.com/Artisan-Lab/RULF0 码力 | 13 页 | 1.68 MB | 1 年前3硬件创业公司的Rust应用和转型 - 陈昱衡
传感器精度增到100nm 远程控制 自动运行 关注逻辑本身不用过分关心内存安全 嵌入式项目评估 Rust物联网不足 解决方案:屏幕上云 冷热板刺激仪 老项目评估 新项目评估 简单工期长,探索型项目优先选择Rust 糖水偏好仪 尾部打标机 已经立项 UI端Rust应用 UI 端 Rust 桌面端 平板端 嵌入式端 曾经 现阶段 即将 未来期望 屏幕上云 屏幕交互是用户体验的核心之一0 码力 | 23 页 | 4.95 MB | 1 年前3
共 11 条
- 1
- 2