bup(基于git的映像备份)如何计算存储对象的哈希值

2024-06-01 00:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

基于^{cd2>}版本控制系统的一些思想和功能,设计了^{cd1}备份程序(https://github.com/bup/bup),用于虚拟机图像的压缩存储。

在^{cd1>}中有^{cd4>}子命令,当传递^{cd5>}选项时,它可以显示存储在备份中的对象的一些sha1,如哈希(十六进制长度相同)。“”。但是类似sha1的散列不等于原始文件的^{{cd7}输出。

原始^{cd2>}通过在数据前面加上'blob NNN\0'字符串来计算sha1散列,其中NNN是以字节为单位的对象大小,并按How does git compute file hashes?https://stackoverflow.com/a/28881708/写入十进制

我测试了前缀'blob NNN\0',但仍然不相同sha1 sum。

bup中使用了什么方法计算文件的哈希和?是线性sha1还是像Merkle树这样的树样的变体?目录的哈希是什么?

bup的^{cd9>}命令的源是https://github.com/bup/bup/blob/master/lib/bup/ls.py,哈希只是以十六进制打印,但哈希是在哪里生成的?

def node_info(n, name, 
    ''' ....
    if show_hash:
        result += "%s " % n.hash.encode('hex')

创建bup备份时生成的哈希(当文件被^{cd10>}+^{cd11>}命令放入备份中)并刚刚打印在^{{cd4>}上;还是在每个^{cd4>}上重新计算,并且可以用作bup备份的完整性测试?


Tags: 文件对象https命令githubcomhash备份
1条回答
网友
1楼 · 发布于 2024-06-01 00:29:19

bup将所有数据存储在一个裸git存储库中(默认情况下该存储库位于~/.bup)。因此,bup的哈希计算方法完全复制了git使用的哈希计算方法。在

然而,与git的一个重要区别是bup可以将文件分成块。如果bup决定将文件拆分为块,则该文件在存储库中表示为树而不是blob。在这种情况下,bup的哈希与相应树的git的哈希一致。在

下面的脚本演示了:

bup_hash_测试

#!/bin/bash

bup init
BUPTEST=/tmp/bup_test
function test_bup_hash()
{
    bup index $BUPTEST &> /dev/null
    bup save -n buptest $BUPTEST &> /dev/null
    local buphash=$(bup ls -s buptest/latest$BUPTEST|cut -d' ' -f 1)
    echo "bup's hash: $buphash"
    echo "git's hash: $(git hash-object $BUPTEST)"
    echo git  git-dir \~/.bup cat-file -p $buphash
    git  git-dir ~/.bup cat-file -p $buphash
}

cat > $BUPTEST <<'END'
    http://pkgsrc.se/sysutils/bup
    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
END

test_bup_hash

echo
echo

echo " -1" >> $BUPTEST

echo "After appending ' -1' line:"
test_bup_hash

echo
echo

echo "After replacing '-' with '#':"
sed -i 's/-/#/' $BUPTEST
test_bup_hash

输出:

^{pr2}$

如我们所见,当bup和{}的哈希匹配时,bup存储库中对应的对象是一个具有预期内容的blob。当bup和{}的哈希不匹配时,具有{}哈希的对象是一棵树。该树中blob的内容对应于完整文件的片段:

^{3}$

相关问题 更多 >