Git 是如何保证完整性的

简介: Git 相信大家每天都在使用,但是心中一直有一个疑问,假如在传送过程中丢失信息或者损坏文件,Git 是怎么发现的?

Git 相信大家每天都在使用,但是心中一直有一个疑问,假如在传送过程中丢失信息或者损坏文件,Git 是怎么发现的?

1.Git 官方的说明

其实,Git 中所有的数据在存储前都会计算校验和,然后以校验和来引用。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。

Git 用以计算校验和的机制叫做SHA-1 散列(hash,哈希)。

这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。

SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

那么问题来了,啥是校验和,啥是 SHA-1? 🤔

2.什么是校验和

来看看维基百科的定义:

校验和(英语:Checksum)是冗余校验的一种形式。

它是通过错误检测方法,对经过空间(如通信)或时间(如计算机存储)所传送数据的完整性进行检查的一种简单方法。

计算机领域常见的校验和的方法有循环冗余校验(CRC)、MD5、SHA家族等。

产生检验和的实际过程一般是向核对函数或检验和算法输入给定的数据,一个良好的检验和算法通常会对进行很小的修改的输入数据都会输出一个显著不同的值。

所以 Git 的做法就是通过文件内容或者目录结构计算校验和,只有校验和完全一致时才能证明文件或者目录没有发生丢失(因为任何微小的变化都会产生截然不同校验和结果)。

3.SHA-1

SHA-1 是常用的一种计算校验和的算法,其他常用的算法还有 md5 和 sha-256。

4.如何查看文件的校验和

Linux 和 Mac 下获取文件的 CRC、MD5、SHA1、SHA256 值是一样的方式:

cksum 文件名    # CRC
md5sum 文件名   # 获取MD5
shasum 文件名   # 获取SHA1

# -a 支持可选值:1 (default), 224, 256, 384, 512, 512224, 512256
shasum -a 256 文件名   #获取SHA256

来实践一下👨🏻‍💻:

如图所示:

  • 第一次操作通过 shasum 命令获取了我电脑上的名叫 test.txt 文件的 SHA1 值;

  • 第二次操作修改了文件名,改为了 test1.txt,此时获取的 SHA1 值与第一次获取的一样,因此,更改文件名不会导致校验和改变;

  • 第三次操作修改了 test1.txt 文件里面的内容,此次获取 SHA1 值就发生了变化。

因此,我们可以得知:只有相同的文件才会有相同的校验和。更改文件名以外的任何内容都将导致不同的校验和。

5.校验和的常见应用场景

  • 检查下载的文件是否有破损

  • 检查下载的文件是否被恶意替换

相关文章
|
小程序
uni-app:刷新当前页面
执行这三行代码就可以实现uniapp刷新当前页面。
5073 0
|
机器学习/深度学习 搜索推荐 算法
【王喆-推荐系统】模型篇-(task5)wide&deep模型
Wide&Deep是工业界中有巨大影响力的模型,如果直接翻译成中文是宽和深的模型,其模型结构如下所示:wide和deep让模型兼具逻辑回归和深度神经网络的特点。
2763 0
【王喆-推荐系统】模型篇-(task5)wide&deep模型
|
10月前
|
Ubuntu Linux 测试技术
Linux系统离线安装Docker完整指南
本文详细介绍在Ubuntu 24等Linux系统中离线安装Docker的完整流程,适用于内网隔离环境。涵盖安装包下载、`docker.service`配置、安装与卸载脚本编写、权限设置、镜像测试及用户组配置,并包含docker-compose的离线部署方法,助力高效完成生产环境搭建。
11143 4
Linux系统离线安装Docker完整指南
|
人工智能 Rust IDE
JetBrains RustRover 2025.1 发布 - 面向 Rust 开发者的强大 IDE
JetBrains RustRover 2025.1 (macOS, Linux, Windows) - 面向 Rust 开发者的强大 IDE
883 27
JetBrains RustRover 2025.1 发布 - 面向 Rust 开发者的强大 IDE
|
消息中间件 缓存 监控
性能测试怎么做?方法、流程与核心要点解析
本文系统阐述了性能测试的核心方法论、实施流程、问题定位优化及报告编写规范。涵盖五大测试类型(负载验证、极限压力、基准比对、持续稳定性、弹性扩展)与七项关键指标,详解各阶段任务如需求分析、场景设计和环境搭建,并提供常见瓶颈识别与优化实战案例。最后规范测试报告内容框架与数据可视化建议,为企业级实践提出建立基线库、自动化回归和全链路压测体系等建议,助力高效开展性能测试工作。
|
API 网络安全 Android开发
Android 设备唯一标识(适配Android版本)
Android 设备唯一标识(适配Android版本)
1719 0
Android 设备唯一标识(适配Android版本)
|
Ubuntu Linux iOS开发
如何实现多个Python环境的Python版本切换
【8月更文挑战第4天】如何实现多个Python环境的Python版本切换
4345 5
|
运维 监控 网络协议
Linux抓包命令tcpdump使用技巧大全
【7月更文挑战第10天】
1388 5
Linux抓包命令tcpdump使用技巧大全
|
JavaScript Ubuntu Shell
Ubuntu上安装任意版本nodejs方法
通过以上步骤,您可以在Ubuntu系统上灵活地安装和管理不同版本的Node.js。这种方法让开发者能够根据不同项目的需要选择合适的Node.js版本,同时也使版本切换变得非常方便。而且,nvm能够为每个项目独立管理依赖,从而确保不同项目之间的环境隔离,增强了开发环境的稳定性和可维护性。
6501 2

热门文章

最新文章