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

2023-11-09

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 如何使用交互式变基将提交编辑为未提交?

    我想使用交互式变基来编辑以前的提交 但是当我进入该提交的编辑模式时 所有文件都已提交 我知道我可以进行更改并修改提交 但我希望所有更改最初都未提交 暂存或以其他方式 这样我就可以对其进行编辑 就像在最初提交之前一样 这可能吗 Imagine
  • Android SHA1 发布密钥库无法与 Google 地图配合使用

    我正在使用 Google Maps Android API 但遇到了一些问题 我正在使用 android studio 签署我的 apk 在 android keystore jks 创建一个 另外 我选择 发布 作为其中的类型 我已经使用
  • 在 github 上的 fork 中跟踪上游的最佳实践

    摘要 对于要维护一组本地更改的上游存储库 处理长期运行跟踪的最佳实践是什么 我想让 github 上的 fork 与上游保持同步 但仍然允许清晰跟踪 fork 特有的更改 对于本次讨论 假设upstream指向主项目存储库并且origin指
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • 如何 git grep 仅一组文件扩展名

    如何执行 git grep 并将检查的文件限制为一组文件 我希望能够 grep cpp 和 h 文件的内容来查找 MyFunc 例如 git grep MyFunc hc 但是 这也匹配 c 文件和 cs 文件 Use git grep M
  • Git:发送电子邮件而不提交

    我有一个项目 我做了更改 并想使用 git send email 功能将它们发送给另一个用户 我发现它可以通过发送补丁来工作 由git format patch每次提交 是否可以只发送diff的 我不想先提交 然后发送补丁 是否有gitfo
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • 默认情况下 git merge -Xignore-space-change

    我该如何设置该选项ignore space change对于所有合并使用git config 我也许可以使用别名merge 但因为我希望该设置应用于git stash pop git stash apply git pull and git
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • 在 Windows 7 上的 Sourcetree 中比较 Word docx 文件

    我一直在尝试获取在 Windows 7 上的 Sourcetree 中工作的 Word docx 文件的文本差异 我已按照此处的说明进行操作将 Microsoft Word 与 git 结合使用 http blog martinfenner
  • 如何克隆特定的 Git 标签

    From git clone 1 手册页 http git scm com docs git clone branch还可以在结果存储库中的该提交处获取标签并分离 HEAD 我试过 git clone branch
  • 当 .gitattributes 中的 EOL 设置为 CRLF 时,Git diff 认为行结尾为 LF

    当我恢复对带有 Windows 行结尾的文件的更改并且 gitattributes 将 EOL 定义为 CRLF 时 git 认为行结尾已更改为 LR 即使十六进制编辑器显示 CRLF 仅当 gitattributes 定义 EOL 字符时
  • Git 将一个分支合并到所有其他分支中

    我知道这个问题已经在这里被问过 https stackoverflow com questions 2329716 merging changes from master into all branches using git https
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • 如何让 Aptana Studio 记住 git ssh 密码

    我找不到任何有关如何获得 Aptana Studio 的内置 git 支持来记住执行推 拉操作的 ssh 密码的指南 信息 有人有什么想法吗 Aptana Studio 实际上是内置的 GIT 程序 它将在 Windows 上的 C Use
  • git reflog 和 log 有什么区别?

    手册页说 log 显示提交日志 reflog 管理 reflog 信息 reflog 信息到底是什么 它有哪些日志没有的信息 日志看起来更详细 git log显示当前的 HEAD 及其祖先 也就是说 它打印提交 HEAD 指向的提交 然后打
  • 哈希上的多次迭代:这不会减少熵吗?

    我看到在很多地方 包括堆栈 都推荐了这种技术 而且我无法摆脱这种技术会减少熵 毕竟 您正在再次对已经被散列过并且有碰撞机会的东西进行散列 碰撞机会大于碰撞机会会不会导致更多的碰撞机会 经过研究 似乎我错了 但为什么呢 既然您标记了 md5

随机推荐

  • springboot+vue跨域(草稿箱中翻出来的)

    第一种 新建 GlobalCorsConfig 类 import org springframework context annotation Bean import org springframework context annotati
  • Copilot是GPT的理想应用模式吗?

    自OpenAI发布ChatGPT以来 LLM持续火热 各大公司纷纷入场 但近一段时间以来 我观测到的LLM应用场景 基本都是Copilot的形式 即以对话为基础的辅助应用 尽管体验起来十分的高大上 但我能明确感受到 这种Copilot的形式
  • pyspark中文api

    内容基于官网pyspark SparkSQL官方文档翻译及拓展 官方文档 https spark apache org docs latest api python reference pyspark sql index html 具体使用
  • Eclipse上的HTML/JSP/XML编辑器插件Eclipse HTML Editor

    官网 http amateras sourceforge jp cgi bin fswiki en wiki cgi page EclipseHTMLEditor Eclipse HTML Editor is an Eclipse plug
  • js的三种弹窗

    1 alert 提示框 用途 一般用于提示信息或者警告信息的展示 2 confirm option 确认 或 取消 消息框 用途 用户点击 确定 或 取消 按钮时 弹窗会返回一个布尔值 确认返回true 取消返回false 由此可以判断用户
  • adb shell 执行sh脚本_程序开发——Shell脚本

    Shell 是一个用 C 语言编写的程序 它是用户使用 Linux 的桥梁 Shell 既是一种命令语言 又是一种程序设计语言 Shell 是指一种应用程序 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务 Ken Tho
  • 深入浅出 Spark Thrift Sever

    一 Spark Thrift Sever是什么 Spark借助Hive的Metadata Service可以实现通过命令行客户端工具执行Sql语句 就像是Hive或者Mysql的命令行工具一样 称之为Spark CLI Spark CLI适
  • 基于GMap.Net的地图解决方案

    一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章 GMap Net开发之在WinForm和WPF中使用GMap Net地图插件 GMap Net是 Net下一个地图控件 可以基于Http协议加载各个公司的地图 如Google
  • 如何设计一个秒杀系统

    什么是秒杀 秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到 对于电商网站中一些稀缺或者特价商品 电商网站一般会在约定时间点对其进行限量销售 因为这些商品的特殊性 会吸引大量用户前来抢购 并且会在约定的时间点同时在
  • MinGW-W64下载、配置教程

    注意 本文采用的操作系统 Windows7 64位 注 文章原创 配图的知乎水印也是笔者账号 一 下载与配置 使用浏览器访问 MinGW W64 图1 找到图2所示区域 根据需求点击一项 下载压缩包 图2 解压下载的压缩包 内容如图3 图3
  • JAVA练习34-验证回文串

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 前言 一 题目 验证回文串 1 题目描述 2 思路与代码 2 1 思路 2 2 代码 总结 前言 提示 这里可以添加本文要记录的大概内容 1月29日练习内容 提示 以下
  • Gin的使用

    Gin框架 gin框架路由使用前缀树 路由注册的过程是构造前缀树的过程 路由匹配的过程就是查找前缀树的过程 gin框架的中间件函数和处理函数是以切片形式的调用链条存在的 我们可以顺序调用也可以借助c Next 方法实现嵌套调用 借助c Se
  • BigDecimal比较大小问题

    BigDecimal比较大小 这个类是Java里精确计算的类 下面说一下两个BigDecimal对象大小 相等的判断 1比较对象是否相等 一般的对象用于等于 但是BigDecimal比较特殊 举个例子 BigDecimal a1 new B
  • android 下拉状态栏(SystemUI)常见修改记录

    摘要 下拉状态栏 1 下拉状态栏的亮度条 frameworks base packages SystemUI src com android systemui qs QSPanel javamBrightnessView对应布局文件 qui
  • 爬虫实例8(os模块的用法)

    import requests import os url https ss3 bdstatic com 70cFv8Sh Q1YnxGkpoWK1HF6hhy it u 460770515 1829173594 fm 26 gp 0 jp
  • 什么是数字水印

    经常有文章把数字签名和数字水印 傻傻分不清 那今天就介绍一下数字水印 一 数字水印技术原理 数字水印是一种信息隐藏技术 它利用人体感官的限制 将数字信号 如图像 文字 符号 数字等一切可以作为标记 标识的信息与原始数据 如图像 音频 视频数
  • 替代for循环,让Python代码更pythonic

    通常如下使用场景中会用到 for 循环 在一个序列来提取一些信息 从一个序列生成另一个序列 写 for 已成习惯 幸运的是 Python 已经有很多工具可以帮助你完成这些工作 你只需要转移你的思路 并以不同的角度来思考它 通过避免编写 fo
  • Pycharm更换python解释器

    Pycharm工程如何更换pycharm解析器 Mac Pycharm gt Preferences 然后会出来如下界面 Windows file gt Default Settings
  • leetcode 300. 最长递增子序列

    2023 8 23 本题也是dp算法解决的经典题型 dp i 的含义 数组前i个元素的最长递增子序列长度 不多说 直接上代码 class Solution public int lengthOfLIS vector
  • 为什么Git用SHA做版本控制,而非像SVN用int数字或者是时间戳

    在分布式领域中 做的最出色的莫过于Git 而Git主要强大之处就在于运用sha作为版本控制的算法 而许多分布式架构的项目也都意义效仿 而sha算法为什么如此神奇呢 SHA是什么 百度百科定义是 安全散列算法 英语 Secure Hash A