Golang 从 io.Reader 计算哈希并追加到末尾 - Multireader

问题描述 投票:0回答:1

我有一个阅读器

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
后立即调用哈希生成函数。

go hash stream suffix
1个回答
0
投票

我使用了这个实现 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
之后。

© www.soinside.com 2019 - 2024. All rights reserved.