#csv #row #id #row-column #output #v5 #uuid

app hashcsv

将一个 id 列添加到 CSV 文件的每一行,包含行的 UUID v5 哈希值

3 个版本 (稳定)

1.0.1 2022年5月25日
1.0.0 2021年2月10日
0.1.1 2021年2月10日

#14 in #row-column

MIT/Apache

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