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
每月下载量 276,781
在 272 个Crate中使用 (22 个直接使用)
450KB
10K SLoC
Rust uint crate使用const-generics
实现了 [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$ 向上取整。如果尝试使用错误的参数构造 Uint,Uint 将会 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 整数语法创建任意长度的常量。使用 U 或 B 后缀后跟位数来指定 Uint 或 Bits 的大小。支持使用它们的修饰符 0x、0b 和 0o 来使用十进制、十六进制,甚至二进制和八进制。可以在字面量中添加下划线 _ 以提高可读性。
# 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。这些可以通过设置同名功能标志来启用。
unstable启用 sem-ver 不稳定功能。rand:实现了从Standard分布式进行采样的功能,即rng.gen()。arbitrary:实现了Arbitrary特性,允许为模糊测试生成Uint。quickcheck:实现了Arbitrary特性,允许为属性测试生成Uint。proptest:实现了Arbitrary特性,允许为属性测试生成Uint。Proptest 用于uint自身的测试套件。serde:为Serialize和Deserialize特质实现Uint和Bits。序列化使用大端十六进制格式的人类可读格式和机器可读格式的大端字节字符串。在人类可读格式中序列化时,Uint使用以太坊Quantity格式(以0x开头的最小字符串)。rlp:为Uint实现Encodable和Decodable特质,允许从/到RLP的序列化。fastrlp:为Uint实现Encodable和Decodable特质,允许从/到RLP的序列化。primitive-types:实现相应类型之间的From<_>转换。postgres:实现支持多种列类型的ToSql特质。num-bigint:实现到/fromBigUint和BigInt的转换。ark-ff:实现到/fromBigInteger*类型和来自ark-ff@0.3的Fp*类型的转换。ark-ff-04:实现到/fromBigInt和Fp类型的转换,来自ark-ff@0.4。sqlx:实现数据库无关的字节数组存储。由于问题sqlx#1627,需要使用sqlx与tokio-native-tls运行时一起使用。zeroize:实现了Zeroize特性。这使得Uint和Bits与secrecy库兼容。valuable:实现了Valuable特性。pyo3:实现了ToPyObject、IntoPy和FromPyObject特性。parity-scale-codec:实现了Encode、Decode、MaxEncodedLen和HasCompact特性。bn-rs:实现了从/toBN和BigNumber的转换。bytemuck:为Uint实现了Pod和Zeroable特性,其中大小为 64 的倍数,最多到 1024。这允许在存在Pod特性约束的地方使用Uint。num-traits:实现了大约四十个适用的特性。
构建和测试
格式化、检查、构建和测试所有内容(我建议为这个操作创建一个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-std和wasm。 - 快速的平台无关的泛型算法。
- 在可用的情况下针对特定目标进行汇编优化。
- 可选的 num-traits 等,支持。
- 具有兼容接口的运行时大小类型。
依赖项
~0–8.5MB
~78K SLoC