写点什么

为什么 Git 用 SHA 做版本控制,而非像 SVN 用 int 数字或者是时间戳

作者:DisonTangor
  • 2021 年 11 月 26 日
  • 本文字数:1278 字

    阅读完需:约 4 分钟

在分布式领域中,做的最出色的莫过于 Git。而 Git 主要强大之处就在于运用 sha 作为版本控制的算法。而许多分布式架构的项目也都意义效仿,而 sha 算法为什么如此神奇呢?

SHA 是什么?

百度百科定义是“安全散列算法(英语:Secure Hash Algorithm,缩写为 SHA)是一个密码散列函数家族,是 FIPS 所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。SHA 家族的五个算法,分别是 SHA-1、SHA-224、SHA-256、SHA-384,和 SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为 SHA-2。SHA-1 在许多安全协定中广为使用,包括 TLS 和 SSL、PGP、SSH、S/MIME 和 IPsec,曾被视为是 MD5(更早之前被广为使用的杂凑函数)的后继者。但 SHA-1 的安全性如今被密码学家严重质疑;虽然至今尚未出现对 SHA-2 有效的攻击,它的算法跟 SHA-1 基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。”

它属于 hash 算法的一种。出于安全性的考虑而被设计出来,但却拥有着不俗的运算速度,以确保最终得到固定长度的结果,且运算具备单向性和唯一性。

原因分析

很多人第一个想到的是时间戳作为版本控制的方式,早期许多游戏公司也是通过时间戳的方式来计算,但是由于时间戳本质就是一个双精度浮点数,在计算过程中不如 int 类型计算快速,且涉及到时间必须保证每台设备的时间都是一致的,这就导致跨时区的时间戳不准确。而且随着开发功能的增加也会导致维护时间戳的逻辑变得异常疯狂。

而对于如 SVN 的 int 类型,可以说是一种非常快速高效的方式,在 linux 的信号量逻辑中就以 int 作为并发的依据,但是在安全性就十分不利。因为任何人都可以通过后门修改数据且无法校验文本是否遭到需要改,而且版本之间通过数字递增的方式也使得关联性表现得极为单薄,遇到竞争极容易产生错误,因此他采用锁技术和集中式存储模式。

面对上述的问题,sha 有如何表现呢?

sha 虽然没有 int 的执行速度,但是他的递归计算都确保版本是连贯的,使之具备 int 递增的优势。不用担心复杂的逻辑维护。

sha 本身是加密算法,所以可以将保存的内容也加入的 sha 的计算中,当有人修改文件内容并回写 sha 版本时会造成前后 sha 版本校验的不一致。Git 在这里就采用分片(或称镜像)的模式,只取修改的部分进行保存,相比 SVN 保存目录,减少了许多冗余数据,且利于压缩。这个技术在区块链中基本常用。所以安全性毋庸置疑。而且在多版本的分布式结构中可以形成branch分支,也可以merge合并。因此版本控制具备强大的灵活性和回溯能力。

目前 sha1 已经被 git 淘汰了,理由如百度百科所说。所以作为分布式系统或者单纯做版本控制的应用都应该将 sha1 改为 sha256。

结语

开发人员运用技术不是平白无故的,都是基于技术和领域知识的掌握程度。当你觉得自己的技能受到限制了,或遇到瓶颈了,往往都源于技术和领域知识的了解不够,只有通过不断地学习和研究才得以提升。并且每次遇到问题,多转换思路思考就可以了。在 Git 中,我们除了 sha 技术,还有很多东西可以借鉴和了解。Linux,npm 和存储系统亦是如此。

发布于: 52 分钟前阅读数: 3
用户头像

DisonTangor

关注

怀揣一个武侠梦的男孩 2020.07.29 加入

还未添加个人简介

评论

发布
暂无评论
为什么Git用SHA做版本控制,而非像SVN用int数字或者是时间戳