匹配SHA1的正则表达式

时间:2009-01-22 07:58:51

标签: git sha1

我正在尝试将普通文本中的SHA1与正则表达式匹配。

理想情况下,我想避免匹配单词。

可以肯定地说,完整的SHA1具有独特的模式(它们很长并且长度一致) - 所以我可以可靠地匹配它们 - 但是缩小的SHA1是什么?

我可以依赖数字的存在吗?

在我的提交日志中查看SHA1 - 数字始终显示在前3个字符中。但这太短了吗?在我可以假设一个数字出现之前,我需要考虑多少个SHA1字符?

这不一定是100%准确 - 我只需要在99%的时间内匹配缩写的SHA1。

6 个答案:

答案 0 :(得分:63)

您可以认为SHA1哈希值是完全随机的,因此这会降低概率。给定数字不是数字的概率是6/16或0.375。三个SHA1数字都不是数字的概率是0.375 ** 3或0.0527(5%ish)。在六位数时,这再次降低到0.00278(0.2%)。五位数字,所有字母的概率都低于1%(你说你希望在99%的时间内匹配)。

制作一个始终与SHA1值匹配的正则表达式很容易:

\b[0-9a-f]{5,40}\b

然而,这也可能匹配完美的五个字母单词,如“添加”或“褪色”。在我的/usr/share/dict/words文件中,有几个六个字母单词匹配:“accede”,“beaded”,“bedded”,“decade”,“deface”,“efface”和“facade”是最多的有可能。在七封信中,只有“深化”,不太可能出现在散文中。这一切都取决于你能容忍多少误报,以及你实际会遇到的可能的话语。

答案 1 :(得分:34)

你到底想要做什么?您不需要使用启发式解析任何git输出 - 您始终可以准确地请求所需的数据。

如果要匹配SHA1总和的完整十六进制表示,请尝试:

/\b([a-f0-9]{40})\b/

即一个单词,由40个字符组成,可以是数字,也可以是字母a到f。

如果你只有几个角色并且不知道它们在哪里,那么你几乎没有运气。 “e78fd98”是缩写的提交ID吗?也许,但是“1234567”怎么样?这是一个提交ID吗?问题票号?一个使测试失败的数字?

如果没有上下文,您无法真正了解数据的含义。

要回答您的直接问题,SHA1的属性不会产生前三个字符(十六进制形式)的数字。你很幸运,或者也许是不幸的,这取决于你如何看待它。

答案 2 :(得分:4)

我假设你想要匹配SHA1的十六进制打印表示,而不是相当于20个原始字节。此外,我将假设有问题的SHA1仅使用小写字母来表示十六进制数字。如果您的要求不同,则必须调整正则表达式。

grep -o -E -e "[0-9a-f]{40}"

将匹配这样的SHA1。您需要将上述正则表达式从egrep的方言转换为您正在使用的任何工具。由于比赛必须正好是40个字符,我不认为你有意外匹配单词的危险。我不知道任何只包含字母a到f的40个字符的单词。

编辑:

更好的是:使用A Regex to match a SHA1作为他的解决方案包括检查两端的单词边界。我忽略了上面的内容。

答案 3 :(得分:3)

如果您有权访问回购,则可以使用git cat-file -e检查它是否代表回购中的对象。这也非常快。如果您还想将此限制为仅提交和标记,则可以使用git cat-file -t来查找对象的类型。

例如,这可用于搜索人工生成的文本以提及git提交并生成指向git web界面的超链接。

答案 4 :(得分:0)

对于这种类型的哈希:43:A4:02:B7:B6:1D:89:86:C5:CE:AD:52:96:D9:2E:7B:64:98:45:6A

/^[0-9A-F]{2}(:[0-9A-F]{2}){19}$/

答案 5 :(得分:0)

我在红宝石中使用它。它允许sha的短版本(碰撞时为6 - 8)和40 chars长的完整sha。

\A(([0-9a-f]{40})|([0-9a-f]{6,8}))\z