19个稳定版本

1.12.3 2024年6月3日
1.12.1 2024年3月12日
1.12.0 2024年2月27日
1.11.1 2023年11月20日
0.3.0 2022年5月23日

数学 类别中排名 10

Download history 46094/week @ 2024-05-03 50055/week @ 2024-05-10 45991/week @ 2024-05-17 53485/week @ 2024-05-24 51314/week @ 2024-05-31 47686/week @ 2024-06-07 53132/week @ 2024-06-14 62705/week @ 2024-06-21 49944/week @ 2024-06-28 52461/week @ 2024-07-05 61618/week @ 2024-07-12 67547/week @ 2024-07-19 61398/week @ 2024-07-26 61405/week @ 2024-08-02 78920/week @ 2024-08-09 63954/week @ 2024-08-16

每月下载量 276,781
272 个Crate中使用 (22 个直接使用)

MIT 许可证

450KB
10K SLoC

Rust uint crate使用const-generics

crates.io docs.rs MIT License dependency status codecov CI

实现了 [Uint<BITS, LIMBS>],模 $2^{\mathsf{BITS}}$ 的数环。它需要两个泛型参数:位数和存储这些位所需的64位'肢体'数量。

# use ruint::Uint;
let answer: Uint<256, 4> = Uint::from(42);

您可以使用 $\mathsf{LIMBS} = \left\lceil{\mathsf{BITS} / 64}\right\rceil$ 计算出 LIMBS,即 LIMBS 等于 BITS 除以 $64$ 向上取整。如果尝试使用错误的参数构造 UintUint 将会 panic!。理想情况下这应该是一个编译时错误,但受Rust问题 #60551 的限制。

在稳定版本中,可以使用更方便的方法,即使用 uint! 宏,该宏将为您构造正确的 Uint

# use ruint::{Uint, uint};
let answer = uint!(42_U256);

您还可以使用预计算的类型之一 aliases

# use ruint::Uint;
use ruint::aliases::*;

let answer: U256 = Uint::from(42);

当然,如果您需要有趣的尺寸,也可以创建自己的类型别名

# use ruint::Uint;
type U1337 = Uint<1337, 21>;

let answer: U1337 = Uint::from(42);

Rust nightly

如果您正在使用nightly,可以使用 Uint<BITS>,它会为您计算肢体数量。遗憾的是,没有 generic_const_exprs 支持无法将其稳定化(Rust问题 #76560)。

# #[cfg(feature = "generic_const_exprs")] {
use ruint::nightly::Uint;

let answer: Uint<256> = Uint::<256>::from(42);
# }

即使在夜间版本中,Rust 的 ergonomics 也有限。在上面的示例中,Rust 要求对 Uint::from 进行显式类型标注,而在稳定版本中则不需要。还有一些更微妙的问题使得这看起来并不像表面上那么理想。这些夜间功能可能需要一段时间才能稳定下来。

示例

use ruint::Uint;

let a: Uint<256, 4> = Uint::from(0xf00f_u64);
let b: Uint<256, 4> = Uint::from(42_u64);
let c  = a + b;
assert_eq!(c, Uint::from(0xf039_u64));

有一个方便的宏 uint! 可以为您创建常量。它允许使用标准的 Rust 整数语法创建任意长度的常量。使用 UB 后缀后跟位数来指定 UintBits 的大小。支持使用它们的修饰符 0x0b0o 来使用十进制、十六进制,甚至二进制和八进制。可以在字面量中添加下划线 _ 以提高可读性。

# use ruint::uint;
let cow = uint!(0xc85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4_U256);

实际上,这个宏会递归地遍历解析树,因此您可以将其应用于整个源文件。

# use ruint::uint;
uint!{

let a = 42_U256;
let b = 0xf00f_1337_c0d3_U256;
let c = a + b;
assert_eq!(c, 263947537596669_U256);

}

请注意,由于 B 是一个有效的十六进制数字,因此可能会产生歧义。在这种情况下,需要使用下划线分隔符 _B 来减轻影响。

支持的 Rust 版本

Uint 将保持至少 6 个月的滚动 MSRV(最低支持 Rust 版本)政策。当提高 MSRV 时,新 Rust 版本必须至少发布 6 个月。当前的 MSRV 是 1.65.0。

请注意,MSRV 不会自动提高,并且只有在小版本更新时才会提高。

功能标志

支持多个 crate。这些可以通过设置同名功能标志来启用。

构建和测试

格式化、检查、构建和测试所有内容(我建议为这个操作创建一个shell别名)

cargo fmt &&\
cargo clippy --all-features --all-targets &&\
cargo test --workspace --all-features --doc -- --nocapture &&\
cargo test --workspace --all-features --all-targets -- --nocapture &&\
cargo doc --workspace --all-features --no-deps

使用提供的 .cargo/config.toml 别名运行基准测试

cargo criterion

检查文档覆盖率

RUSTDOCFLAGS="-Z unstable-options --show-coverage"  cargo doc --workspace --all-features --no-deps

特性

  • 所有您可能想要的提升生活质量的特性。
  • 与 std u64 等类型兼容。请参阅 Rust 的 整数方法
  • 遵循 Rust API 指南
  • Montgomery REDC 和其他用于实现素数域的算法。

待办事项

  • 构建 no-stdwasm
  • 快速的平台无关的泛型算法。
  • 在可用的情况下针对特定目标进行汇编优化。
  • 可选的 num-traits 等,支持。
  • 具有兼容接口的运行时大小类型。

lines of code GitHub contributors GitHub issues GitHub pull requests GitHub Repo stars crates.io

依赖项

~0–8.5MB
~78K SLoC