下面的代码将文件读入字节并计算字节数组的md5sum。它的工作,但我想找到一个解决方案,在V,需要较少的RAM。谢谢你的评论!
import os
import crypto.md5
b := os.read_bytes("file.txt") or {panic(err)}
s := md5.sum(b).hex()
println(s)我也尝试过,但没有成功:
import os
import crypto.md5
import io
mut f := os.open_file("file.txt", "r")?
mut h := md5.new()
io.cp(mut f, mut h)?
s := h.sum().hex()
println(s) // does not return the correct md5sum发布于 2022-05-30 20:19:21
好的。这就是你要找的东西。它产生的结果与md5sum相同,而且速度稍慢。block_size与计算校验和的内存量和速度成反比关系。减少block_size将减少内存占用,但计算时间更长。增加block_size有相反的效果。我在2GB的manjaro磁盘映像上进行了测试,可以确认内存使用率非常低。
注意:在没有-prod标志的情况下,执行起来确实要慢得多。V编译器进行特殊的优化,以便更快地运行生产构建。
import crypto.md5
import io
import os
fn main() {
println(hash_file('manjaro.img')?)
}
const block_size = 64 * 65535
fn hash_file(path string) ?string {
mut file := os.open(path)?
defer {
file.close()
}
mut buf := []u8{len: block_size}
mut r := io.new_buffered_reader(reader: file)
mut digest := md5.new()
for {
x := r.read(mut buf) or { break }
digest.write(buf[..x])?
}
return digest.checksum().hex()
}发布于 2022-05-29 16:23:53
总结一下我从这些评论中学到的东西:
是一种带有类型化arguments
md5.sum的编程语言,它采用字节数组参数,而不是字节序列,例如从文件as-you-go.
md5.sum。
因此,您必须自己实现MD5。也许标准库是开源的,您可以在此基础上构建!或者,您只需绑定MD5的任何现有实现(例如C),并在读取它们时以字节作为提要,以512位= 2⁶字节的块为单位。
编辑:我不知道V,所以我很难判断,但是看起来Digest.write是一种将数据连续推送到MD5计算中的方法。也许,再加上with循环从文件中读取字节是解决方案吗?
https://stackoverflow.com/questions/72425036
复制相似问题