我正在检测非常大(30+ GB)的文件是否相同。而不是散列所有30 GB,我认为我将哈希第一兆字节,然后兆字节从10%开始进入文件,然后兆字节从20%开始进入文件,依此类推。检测1000万字节是否相同对于我的目的来说已经足够了。
在Ruby或JavaScript中,当我这样做时,我只需创建一个10 MB的缓冲区,读入1 MB,在文件中向前搜索,在缓冲区中再读取1 MB,向前搜索等,然后哈希缓冲区。
在Go中,我对如何执行此操作感到有点困惑,因为Read
,ReadFull
,ReadAtLeast
等函数似乎都将缓冲区作为参数然后读到它们填满它。所以我可以分配11个单独的缓冲区,用单独的1 MB块填充10个,然后将它们连接到最后一个哈希...但这似乎超级低效和浪费。我确定我错过了一些东西,但是搜索文档只会让我更加困惑。什么是Go中这个问题的合适解决方案?我可以简单地要求将 n 字节读入预先存在的缓冲区吗?
答案 0 :(得分:5)
您可以将传递的[]byte
缓冲区切换为Read
或ReadFull
。
“切片”切片指向同一个支持数组,因此请分配完整缓冲区,并将其切片到位:
r.Read(buf[i : i+chunkSize])
或
io.ReadFull(r, buf[i:i+chunkSize])