我有一个阅读器
in
代表我想要处理的一些文件数据,但也计算哈希值,然后将其附加在其末尾。
挑战在于数据哈希只能在
in
完全处理/消耗后才能计算。
我的第一个想法是使用:
MultiReader
。
// HASH GENERATION - This should be called after `in` is consumed
preHasher, err := hash.NewMultiHasherTypes(hash.NewHashSet(hash.MD5))
if err != nil {
return nil, err
}
in = io.TeeReader(in, preHasher)
hash := preHasher.Sums()[hash.MD5]
byteHash, err := hex.DecodeString(hash)
if err != nil {
return nil, err
}
// HASH GENERATION - END
// Create reader from hash
hashEndReader := io.LimitReader(bytes.NewReader(byteHash), 16)
// Append hash to the end
newInput := io.MultiReader(in, hashEndReader)
问题是,在
hash
阅读器完全消耗后,我需要调用一个函数来生成 in
。上面的例子并非如此。
知道可以使用什么构造吗?理想情况下,
hashEndReader
将动态生成(或某些延迟加载),其中在消耗in
后立即调用哈希生成函数。
我使用了这个实现 LazyReader 方法的包:https://github.com/spatialcurrent/go-lazy
hashEndReaderLazy := lazy.NewLazyReader(func() (io.Reader, error) {
unencryptedHash := preHasher.Sums()[hash.MD5]
byteHash, err := hex.DecodeString(unencryptedHash)
if err != nil {
return nil, err
}
hashEndReader := io.LimitReader(bytes.NewReader(byteHash), 16)
return hashEndReader, nil
})
newInput := io.MultiReader(in, hashEndReaderLazy)
在这种情况下,回调函数会在初始化:
hashEndReaderLazy
时调用,就在读取:in
之后。