3 个版本 (稳定)
1.0.1 | 2022年5月25日 |
---|---|
1.0.0 | 2021年2月10日 |
0.1.1 | 2021年2月10日 |
#14 in #row-column
9KB
91 行
hashcsv
:使用 CSV 行内容为每一行分配 ID
hashcsv
将接受一个 CSV 文件作为输入,并输出相同的 CSV 数据,附加一个 id
列。该 id
列包含规范化行内容的 UUID v5 哈希值。此工具用适度优化的 Rust 编写,应适用于大型 CSV 文件。在开发者的笔记本电脑上测试时,其吞吐量约为 65 MiB/s。
用法
可以通过以下方式调用
hashcsv input.csv > output.csv
hashcsv < input.csv > output.csv
如果 input.csv
包含
a,b,c
1,2,3
1,2,3
4,5,6
则 output.csv
将包含
a,b,c,id
1,2,3,ab37bf3a-c35c-51a9-802d-8eda9ee2f50a
1,2,3,ab37bf3a-c35c-51a9-802d-8eda9ee2f50a
4,5,6,481492ee-82c7-58b9-95ec-d92cbcd332c4
还可以选择重命名 id
列。有关详细信息,请参阅 --帮助
。
限制:生日问题
UUID v5 基于 SHA 哈希,并保留 122 位哈希输出。
这意味着如果您对 2^(122/2) = 2^61 ≈ 2.3×10^18 行进行哈希,您应该预期至少发生 50% 的碰撞。这相当于 2.3 十亿 行,对于许多应用来说应该是足够的。有关更多信息,请参阅 生日问题。
基准测试
要测量吞吐量,请以发布模式构建
cargo build --release --target x86_64-unknown-linux-musl
然后使用 pv
来测量输出速度
../target/x86_64-unknown-linux-musl/release/hashcsv test.csv | pv > /dev/null
为了找到热点位置,
perf record --call-graph=lbr \
../target/x86_64-unknown-linux-musl/release/hashcsv test.csv > /dev/null
依赖关系
~7–18MB
~196K SLoC