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

在分布式领域中,做的最出色的莫过于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和存储系统亦是如此。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值