Borsh 安全高效的二进制序列化第三届中国 Rust 开发者大会 安全高效的二进制序列化 Daniel Wang @ NEAR Borsh • 运行、编码效率 • 确定性 • 跨平台兼容性 二进制序列化的问题 Binary Object Representation Serializer for Hashing • 字节级别确定性 • 执行速度快 Borsh • 轻量级 • 每一个对象与其二进制表示之间都存在一个双射映射 中, borsh 并没有使用 serde • 全部逻辑原生实现 • 序列化、反序列化速度大幅领先其他解决方案 执行速度 执行速度 benchmark 执行速度 benchmark 执行速度 benchmark 执行速度 benchmark • 编译后的体积更小 • borsh 序列化后的二进制更精简 轻量级 序列化结果体积对比 Borsh 基本用法 Case Study NEAR NEAR 智能合约 Case Study Solana 智能合约 Case Study • non self-describing • 保证序列化后的二进制唯一性和确定性 • 主要序列化规则 Borsh 规范 • 整数采用低字节序( little endian) 存储 • 对于动态长度的集合,先用一个 u32 存储集合 size • 对于原本无序的集合(如 hashmap ),存储时使用0 码力 | 21 页 | 3.35 MB | 1 年前3
 Comprehensive Rust(日语) 202412のクローン(name.clone())を渡すこともできます。 • Rust では、ムーブセマンティクスをデフォルトにし、クローンをプログラマに明示的に行わせて います。これにより、C++ に比べて意図せずコピーを作成するリスクが低減されています。 その他 Defensive Copies in Modern C++ 最新の C++ では、この問題を別の方法で解決します。 std::string ust によく似ています)で記述すると、CXX ツールが Rust と C++ の両方で関数と型の宣言を生成します。 CXX の詳細な使用例については、CXX チュートリアル をご覧ください。 図を見ながら話しましょう。裏で行われる処理は以前とまったく同じであり、このプロセスを自動化す ると次のようなメリットがあることを説明します。 • このツールは、C++ 側と Rust 側が一致すること 対する注目度が薄れるので、これには賛否両論があります。ただし厳密には、外部コードを Rust バイナ リに取り込むと、Rust の観点からは想定していない動作が発生する可能性があります。 249 具体的な答えは、このページの上部の図にあります。裏では、CXX は Rust の unsafe 関数と extern "C" 関数を生成します。これは前のセクションで手動で行ったのとまったく同じです。 44.3 Exercise: Interoperability0 码力 | 381 页 | 1.36 MB | 10 月前3
 Hello 算法 1.1.0 Rust版4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构。 ‧ 随机访问:如果我们想随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实现 随机抽样。 ‧ 排序和搜索:数组是排序和搜索算法最常用的数据结构。快速排序、归并排序、二分查找等都主要在数 组上进行。 ‧ 查找表:当需要快速查找一个元素或其对应关系时,可以 Vec= vec![6, 8, 7, 10, 9]; nums.extend(nums1); 6. 排序列表 完成列表排序后,我们便可以使用在数组类算法题中经常考查的“二分查找”和“双指针”算法。 // === File: list.rs === /* 排序列表 */ nums.sort(); // 排序后,列表元素从小到大排列 4.3.2 列表实现 许多编程语言内置了列表,例如 多次哈希是开放寻址的一种,开放寻址法都有不能直接删除元素的缺陷,需要通过标记删除。标记为已删除 的空间可以再次使用。当将新元素插入哈希表,并且通过哈希函数找到标记为已删除的位置时,该位置可以 被新元素使用。这样做既能保持哈希表的探测序列不变,又能保证哈希表的空间使用率。 Q:为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因此,线性探测 0 码力 | 388 页 | 18.50 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 Rust 版4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构。 ‧ 随机访问:如果我们想随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实现 随机抽样。 ‧ 排序和搜索:数组是排序和搜索算法最常用的数据结构。快速排序、归并排序、二分查找等都主要在数 组上进行。 ‧ 查找表:当需要快速查找一个元素或其对应关系时,可以 Vec= vec![6, 8, 7, 10, 9]; nums.extend(nums1); 6. 排序列表 完成列表排序后,我们便可以使用在数组类算法题中经常考查的“二分查找”和“双指针”算法。 // === File: list.rs === /* 排序列表 */ nums.sort(); // 排序后,列表元素从小到大排列 4.3.2 列表实现 许多编程语言内置了列表,例如 多次哈希是开放寻址的一种,开放寻址法都有不能直接删除元素的缺陷,需要通过标记删除。标记为已删除 的空间可以再次使用。当将新元素插入哈希表,并且通过哈希函数找到标记为已删除的位置时,该位置可以 被新元素使用。这样做既能保持哈希表的探测序列不变,又能保证哈希表的空间使用率。 Q:为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因此,线性探测 0 码力 | 387 页 | 18.51 MB | 10 月前3
 Hello 算法 1.0.0 Rust版4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构。 ‧ 随机访问:如果我们想随机抽取一些样本,那么可以用数组存储,并生成一个随机序列,根据索引实现 随机抽样。 ‧ 排序和搜索:数组是排序和搜索算法最常用的数据结构。快速排序、归并排序、二分查找等都主要在数 组上进行。 ‧ 查找表:当需要快速查找一个元素或其对应关系时,可以 Vec= vec![6, 8, 7, 10, 9]; nums.extend(nums1); 6. 排序列表 完成列表排序后,我们便可以使用在数组类算法题中经常考查的“二分查找”和“双指针”算法。 // === File: list.rs === /* 排序列表 */ nums.sort(); // 排序后,列表元素从小到大排列 4.3.2 列表实现 许多编程语言内置了列表,例如 多次哈希是开放寻址的一种,开放寻址法都有不能直接删除元素的缺陷,需要通过标记删除。标记为已删除 的空间可以再次使用。当将新元素插入哈希表,并且通过哈希函数找到标记为已删除的位置时,该位置可以 被新元素使用。这样做既能保持哈希表的探测序列不变,又能保证哈希表的空间使用率。 Q:为什么在线性探测中,查找元素的时候会出现哈希冲突呢? 查找的时候通过哈希函数找到对应的桶和键值对,发现 key 不匹配,这就代表有哈希冲突。因此,线性探测 0 码力 | 383 页 | 17.61 MB | 1 年前3
 Hello 算法 1.2.0 繁体中文 Rust 版4.1.3 陣列典型應用 陣列是一種基礎且常見的資料結構,既頻繁應用在各類演算法之中,也可用於實現各種複雜資料結構。 ‧ 隨機訪問:如果我們想隨機抽取一些樣本,那麼可以用陣列儲存,並生成一個隨機序列,根據索引實現 隨機抽樣。 ‧ 排序和搜尋:陣列是排序和搜尋演算法最常用的資料結構。快速排序、合併排序、二分搜尋等都主要在 陣列上進行。 ‧ 查詢表:當需要快速查詢一個元素或其對應關係時,可 多次雜湊是開放定址的一種,開放定址法都有不能直接刪除元素的缺陷,需要透過標記刪除。標記為已刪除 的空間可以再次使用。當將新元素插入雜湊表,並且透過雜湊函式找到標記為已刪除的位置時,該位置可以 被新元素使用。這樣做既能保持雜湊表的探測序列不變,又能保證雜湊表的空間使用率。 Q:為什麼線上性探查中,查詢元素的時候會出現雜湊衝突呢? 查詢的時候透過雜湊函式找到對應的桶和鍵值對,發現 key 不匹配,這就代表有雜湊衝突。因此,線性探查 Vec{ // 初始化佇列,加入根節點 let mut que = VecDeque::new(); que.push_back(root.clone()); // 初始化一個串列,用於儲存走訪序列 let mut vec = Vec::new(); while let Some(node) = que.pop_front() { // 隊列出隊 vec.push(node.borrow() 0 码力 | 388 页 | 18.82 MB | 10 月前3
 Comprehensive Rust(繁体中文)6 巨集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.7 練習:考拉茲序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 6.7.1 解決方案 . . . . . . . . minutes break 和 continue 4 minutes 區塊 (block) 和範疇 (scope) 5 minutes 函式 3 minutes 巨集 2 minutes 練習:考拉茲序列 15 minutes 6.1 if 表達式 你可以像在其他語言中使用 if 陳述式那樣地使用 if 表達式: fn main() { let x = 10; if x == 0 { println 本節的重點在於,上述的便利性不僅常見,而且確實存在,學員需瞭解如何運用。至於為何將便利性定義為 巨集,以及巨集展開後會變成什麼內容,則沒有那麼重要。 本課程不會探討如何定義巨集,但後續章節將說明衍生巨集的用法。 6.7 練習:考拉茲序列 The Collatz Sequence is defined as follows, for an arbitrary n 1 greater than zero: • If *n i0 码力 | 358 页 | 1.41 MB | 10 月前3
 Comprehensive Rust(繁体中文) 2024066 巨集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 6.7 練習:考拉茲序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.7.1 解決方案 . . . . . . . . minutes break 和 continue 4 minutes 區塊 (block) 和範疇 (scope) 5 minutes 函式 3 minutes 巨集 2 minutes 練習:考拉茲序列 15 minutes 6.1 if 表達式 你可以像在其他語言中使用 if 陳述式那樣地使用 if 表達式: fn main() { let x = 10; if x == 0 { println 本節的重點在於,上述的便利性不僅常見,而且確實存在,學員需瞭解如何運用。至於為何將便利性定義為 巨集,以及巨集展開後會變成什麼內容,則沒有那麼重要。 本課程不會探討如何定義巨集,但後續章節將說明衍生巨集的用法。 6.7 練習:考拉茲序列 The Collatz Sequence is defined as follows, for an arbitrary n1 greater than zero: • If ni is 1,0 码力 | 356 页 | 1.41 MB | 1 年前3
 Rust API可靠性分析与验证Rust China Conf 2021 – 2022, Online, China RULF:模糊测试用例程序生成 带有剪枝 的BFS 生成API调用序列 反向搜索 合并与优 化 模糊测试用例程序 短序列 长序列 最优序列 集合 合并 优化 构建API依赖图 合成合法的测试 函数 Rust库源代码 泛型函数 单态化 所有权检查 开源于https://github.0 码力 | 13 页 | 1.68 MB | 1 年前3
 Rust 程序设计语言 简体中文版 1.85.0. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 13.2. 使用迭代器处理元素序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 中使用 while 循环的倒计时例子,大部分 Rustacean 也会使 用 for 循环。这么做的方式是使用 Range,它是标准库提供的类型,用来生成从一个数字开始 到另一个数字之前结束的所有数字的序列。 下面是一个使用 for 循环来倒计时的例子,它还使用了一个我们还未讲到的方法,rev,用来 反转 range。 文件名:src/main.rs fn main() { for number 引用必须总是有效的。 接下来,我们来看看另一种不同类型的引用:slice。 87/562Rust 程序设计语言 简体中文版 Slice 类型 切片(slice)允许你引用集合中一段连续的元素序列,而不用引用整个集合。slice 是一种引 用,所以它不拥有所有权。 这里有一个编程小习题:编写一个函数,该函数接收一个用空格分隔单词的字符串,并返回在 该字符串中找到的第一个单词。如果函数在该字0 码力 | 562 页 | 3.23 MB | 29 天前3
共 16 条
- 1
 - 2
 













