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