
























Bijou64 是一篇讨论新的 variable-length integer encoding 的设计:前 1 个字节直接给出长度,0x00–0xF7 用作单字节值,较大的值则用首字节指明后续字节数,因此每个整数只有一种 canonical representation。评论把它放到 LEB128(DWARF 调试信息和 WASM(WebAssembly,一种在浏览器与运行时里使用的字节码格式)常用的变长整数)这个老问题上比较,因为 LEB128 允许 overlong encoding,而这会牵涉链接、签名、内容寻址和解析一致性。很多人又把话题扩展到 protobuf、QUIC、SQLite 的 varint 以及 BER-TLV(ASN.1 相关的长度-值编码),讨论它们在压缩率、SIMD 解码、边界检查和可补丁性之间的权衡。还有人指出,编译器链接、流式写入和协议封装等场景会故意保留“多字节但不唯一”的表示,以便先预留空间、后回填长度。
一部分评论认为 Bijou64 在 SIMD 场景下并不占优,因为它的后续字节依赖首字节,边界信息不如 ULEB128 那样固定、可提前批量探测。相比之下,ULEB128 可以用 continuation bit 很快找出多个边界,更容易在一个向量窗口里并行处理。也有人反驳说,单值解码本身仍然可以用 SIMD 指令完成,只是它和真正的 byte-parallel codec 属于不同设计空间。讨论最后基本收敛到:如果是批量解析大量整数、搜索倒排表或类似场景,边界可预测性比“第一字节看出长度”更关键。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11]
很多评论把焦点放在 canonicality 上,认为同一数值只有一种合法表示,能减少解析器分歧和隐藏 bug。有人举出 UTF-8 overlong encoding、ASN.1 BER/DER、SAML XML signature wrapping 和 Bitcoin transaction malleability 之类的经典问题,说明非唯一编码会给签名、内容寻址和互操作带来麻烦。还有人提到 fuzzing 时,只有单一编码时更容易做 round-trip 检查,因为测试工具不会很快被“替代表示”分流。也有人指出,严格规范化并不自动消灭漏洞,range check、overflow check 和边界验证仍然必须做。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12]
另一组评论强调,非规范编码在工程上是有用的,尤其是在先占位、后回填长度的场景里。编译器链接时常常不知道最终地址,先用最宽形式写入可以避免把后面的代码整体挪位;流式写入 msgpack、重写媒体容器、或在缓冲区里预留长度字段时也会用到类似技巧。有人认为这类设计的核心价值不是“省字节”,而是让写入流程不必做两遍编码。也有人提醒,若把这种技巧当成默认方案,容易掩盖更好的数据布局选择。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9]
评论区不断拿 Bijou64 和现有 varint 方案做横向对比,尤其是 LEB128、protobuf varints、SQLite varints 和 QUIC varint。有人指出 SQLite3 的 varint 是 big-endian 的 1-9 字节方案,而 SQLite4 的思路更接近这里讨论的方向;也有人提到 vu128、VByte、Elias omega coding 和 metric/imperial varint 作为相关探索。讨论普遍认为,Bijou64 的优点是小整数表示更直观、uint64 范围内不需要第 10 个字节,但代价是放弃了 LEB128 那种从任意位置快速定位边界的能力。整体上,大家承认没有一种 varint 能同时在压缩率、速度、可流式解析和实现简单性上都赢。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12] [来源13]
还有人专门盯住这个设计的上限:它只面向 uint64,而不是任意精度整数,因此在 bigInt 风格用途上会显得局促。更大的担忧是实现细节:如果忘了处理首字节的最大值分支,或者没有把 end_address / max_read 之类的限制传进去,就可能出现越界读、wraparound 或错误偏移。评论里有人认为这种风险并不比 LEB128 更低,只是把错误形态换了一种;也有人觉得只要 decoder 写得足够严格,这些都只是普通的边界检查问题。总体看,这种格式的“简化”会把压力从 canonicality 转移到 overflow 和 buffer validation 上。
[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9]
varint: variable-length integer 的简称,用可变字节数表示整数以节省小数值空间。
LEB128: Little Endian Base 128,一种常见的变长整数编码,靠 continuation bit 连接多个字节。
ULEB128: unsigned LEB128,LEB128 的无符号版本,常用于 DWARF、WASM 等格式。
SIMD: Single Instruction, Multiple Data,用向量指令并行处理多个数据。
canonicality: 规范化/唯一表示属性;同一个值只有一种合法编码。
overlong encoding: 用比必要更多的字节表示同一值的非规范编码。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。