首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vlang中文件md5sum的内存高效计算

vlang中文件md5sum的内存高效计算
EN

Stack Overflow用户
提问于 2022-05-29 15:37:45
回答 2查看 171关注 0票数 0

下面的代码将文件读入字节并计算字节数组的md5sum。它的工作,但我想找到一个解决方案,在V,需要较少的RAM。谢谢你的评论!

代码语言:javascript
复制
import os
import crypto.md5

b := os.read_bytes("file.txt") or {panic(err)}

s := md5.sum(b).hex()

println(s)

我也尝试过,但没有成功:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-30 20:19:21

好的。这就是你要找的东西。它产生的结果与md5sum相同,而且速度稍慢。block_size与计算校验和的内存量和速度成反比关系。减少block_size将减少内存占用,但计算时间更长。增加block_size有相反的效果。我在2GB的manjaro磁盘映像上进行了测试,可以确认内存使用率非常低。

注意:在没有-prod标志的情况下,执行起来确实要慢得多。V编译器进行特殊的优化,以便更快地运行生产构建。

代码语言:javascript
复制
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()
}
票数 0
EN

Stack Overflow用户

发布于 2022-05-29 16:23:53

总结一下我从这些评论中学到的东西:

是一种带有类型化arguments

  • md5.sum的编程语言,它采用字节数组参数,而不是字节序列,例如从文件as-you-go.

  • There's中读取,而不是替代md5.sum

因此,您必须自己实现MD5。也许标准库是开源的,您可以在此基础上构建!或者,您只需绑定MD5的任何现有实现(例如C),并在读取它们时以字节作为提要,以512位= 2⁶字节的块为单位。

编辑:我不知道V,所以我很难判断,但是看起来Digest.write是一种将数据连续推送到MD5计算中的方法。也许,再加上with循环从文件中读取字节是解决方案吗?

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72425036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档