公司动态
Monty如何实现任意精度整数?num-bigint引擎与4300位解析上限详解
Monty如何实现任意精度整数num-bigint引擎与4300位解析上限详解【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/montyMonty是一个用 Rust 编写、专为 AI 场景设计的最小安全 Python 解释器它对 Python 原生的任意精度整数arbitrary precision int做了完整支持底层由num-bigint库驱动并在解析与字符串转换两端设置了与 CPython 3.11 一致的4300 位十进制解析上限从源头阻断 O(n²) 复杂度的整数转换拒绝服务DoS攻击。本文带你快速看懂这套性能快路径 安全硬限制的双层设计。为什么解释器必须支持任意精度整数Python 语言中int只有一个类型且没有上界——2 ** 100000是完全合法的。任何想兼容 Python 的解释器包括面向 AI 沙箱的 Monty都必须解决这个问题同时还要回答第二个问题恶意代码写int(9 * 100000)会怎样答案藏在 Monty 的两套机制里。一、num-bigint 引擎LongInt 的三级火箭Monty 在 crates/monty/src/types/long_int.rs 中定义了LongInt类型——它是num-bigint 0.4见 Cargo.toml 中的 workspace 依赖的轻量包装。命名成LongInt而非BigInt是为了强调它是 Python 单一int类型的实现细节而不是一个新类型。其性能策略是一条按需升级的火箭路径 阶段表示方式适用场景第 1 级立即数Value::Int(i64)绝大多数日常整数零堆分配第 2 级i128中转左移等操作的中间态wide_i128_into_value第 3 级堆上LongInt(BigInt)真正的任意精度数值关键细节是自动降级LongInt::into_value()在每次运算后检查结果能否塞回i64能就降级回立即数long_int.rs#L92-L100。这保证了big 10**100; small big // 10**100之后small依然走最快的立即数路径。另一个容易忽略的工程点是哈希一致性hash(5)必须等于hash(LongInt(5))否则字典键会出错。crates/monty/src/hash.rs#L181 中的hash_python_long_int对小数值直接复用 i64 哈希对超大数则对符号 小端字节做哈希两世界无缝衔接。二、4300 位上限三道防线Monty 与 CPython 3.11 的sys.int_max_str_digits默认值保持一致硬编码为 4300long_int.rs#L33-L47pub(crate) const INT_MAX_STR_DIGITS: usize 4300;这个限制只针对十进制因为它对应的字符串解析算法是 O(n²) 的而0x/0b/0o前缀的十六进制、二进制、八进制走 O(n) 算法完全不受限——所以错误信息会贴心地建议consider hexadecimal for large integer literals。三道防线分别卡在三个环节字面量解析期parse_int_literal在构造 BigInt 之前先数字符串中的十进制位数超过 4300 位直接在编译期报 SyntaxErrorparse.rs#L2482-L2519昂贵的 O(n²) 解析根本不会发生。整数字符串化期str()/repr()/print()/ f-string 走check_bigint_str_digits_limit它把数值与缓存的10**4300阈值OnceLockBigInt惰性初始化比较。边界处理很精确10**4300 - 1恰好 4300 位放行10**43004301 位抛ValueError。运行时int(s, base)同样在解析前拒绝超 4300 位十进制字符串docs/resource-limits.md 有专门说明。报错文案与 CPython 逐字对齐见 exception_private.rs#L1338-L1360Exceeds the limit (4300 digits) for integer string conversion三、配套的资源预检算之前就验算光限 4300 位还不够——10**4299本身就是一个 4300 位的合法数继续做乘法/幂运算仍可能吃光内存。Monty 在 crates/monty/src/resource_checks.rs 提供了一组预检函数在分配内存前按输入位宽估算结果大小check_mult_size乘积位数 ≈ 两数位数之和check_lshift_size左移位数 原位数 移位数check_pow_size幂运算额外乘 4 倍安全系数因为快速幂法中新旧基、新旧累加器并存check_div_size除法结果不超过被除数位数超出沙箱内存预算时直接失败而不是等机器被拖垮。另外base ** exp的指数超过u32::MAX会直接抛OverflowError。四、验证行为测试用例导航想动手体验或核对 CPython 兼容性这些文件是最好的入口 crates/monty/test_cases/int__bigint.py — 任意精度字面量、四则运算crates/monty/test_cases/int__max_str_digits.py — 4300 位边界、str/repr/print/f-string 报错crates/monty/test_cases/int__bigint_errors.py — 错误信息与 CPython 逐字对齐crates/monty/tests/parse_large_literals.rs — Rust 侧的字面量解析上限测试4301 位拒绝 / 4300 位放行 / 十六进制不受限小结Monty 的任意精度整数方案可以概括为一句话日常走 i64 快路径越界升 LongInt(BigInt)4300 位十进制是安全红线每次大运算前先验算。它用num-bigint补齐了 Python 的无限大整数语义又用解析前数位数、转换前比阈值、分配前估位宽的三层预检让沙箱在 AI 驱动的自动化场景中既完整又安全。【免费下载链接】montyA minimal, secure Python interpreter written in Rust for use by AI项目地址: https://gitcode.com/GitHub_Trending/monty3/monty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考