我試圖將SHA1的泛型文本與正則表達式匹配。正則表達式匹配SHA1
理想情況下,我想避免匹配單詞。可以肯定地說,完整的SHA1有一個獨特的模式(它們長而且長度一致) - 所以我可以可靠地匹配這些模式 - 但是縮寫SHA1是怎麼回事呢?
我可以依靠數字的存在嗎?
查看我提交日誌中的SHA1 - 數字始終顯示在前3個字符中。但這是否太短?在我能假設一個數字之前,我需要考慮多少個SHA1字符?
這不一定是100%準確的 - 我只需要匹配縮寫SHA1 99%的時間。
我試圖將SHA1的泛型文本與正則表達式匹配。正則表達式匹配SHA1
理想情況下,我想避免匹配單詞。可以肯定地說,完整的SHA1有一個獨特的模式(它們長而且長度一致) - 所以我可以可靠地匹配這些模式 - 但是縮寫SHA1是怎麼回事呢?
我可以依靠數字的存在嗎?
查看我提交日誌中的SHA1 - 數字始終顯示在前3個字符中。但這是否太短?在我能假設一個數字之前,我需要考慮多少個SHA1字符?
這不一定是100%準確的 - 我只需要匹配縮寫SHA1 99%的時間。
你可以認爲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
然而,這也可以匹配完美的5個字母的單詞,如「添加」或「褪色」。在我的/usr/share/dict/words
文件中,有幾個六個字母的單詞可以匹配:「繼承」,「串珠」,「層疊」,「十年」,「塗抹」,「擦除」和「立面」是最有可能的。在七封信中,只有「已深入」,不太可能出現在散文中。這一切都取決於你可以容忍多少誤報,以及你實際遇到的可能詞彙是什麼。
爲什麼{5,40}而不是{40}? – 2010-07-30 14:59:14
你究竟想要做什麼?你不需要用啓發式解析任何git輸出 - 你總是可以準確地請求你所需要的數據。
如果你想匹配的SHA1總和的全十六進制表示,嘗試:
/\b([a-f0-9]{40})\b/
也就是說,由40個字符它們要麼數字或A到F的字母詞。
如果你只有幾個角色,不知道他們在哪裏,那麼你幾乎不走運。 「e78fd98」是一個縮寫的提交ID嗎?也許吧,但是「1234567」呢?這是一個提交ID?問題單號碼?一個使測試失敗的數字?
沒有上下文,你不能真正知道數據的含義。
若要回答您的直接問題,沒有將使前三個字符(十六進制形式)數字的SHA1的屬性。取決於你如何看待它,你只是幸運,或者不幸。
我打算假設你想要匹配SHA1的十六進制打印表示,而不是等同的20個原始字節。此外,我將假設所討論的SHA1只使用小寫字母來表示十六進制數字。如果您的要求不同,您將不得不調整正則表達式。
grep -o -E -e "[0-9a-f]{40}"
會匹配這樣的SHA1。您需要將以上正則表達式從egrep的方言轉換爲您碰巧使用的任何工具。由於比賽必須長達40個字符長,我不認爲你有意外地匹配單詞的危險。我不知道任何只有字母a到f的40個字符的單詞。
編輯:
更重要的是:使用A Regex to match a SHA1作爲他的解決方案還包括在兩端字邊界檢查。我忽略了上述情況。
如果您有權訪問回購協議,可以使用git cat-file -e
來檢查它是否代表回購協議中的對象。這也非常快。如果您還想限制這只是提交和標籤,您可以使用git cat-file -t
找出對象的類型。
例如,這可用於搜索人工生成的文本以提及git提交併生成到git Web界面的超鏈接。
對於這種類型的散列: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}$/
我在Ruby中使用。它允許使用短版本的sha(衝突情況下爲6 - 8)以及長度爲40個字符的full sha。
\A(([0-9a-f]{40})|([0-9a-f]{6,8}))\z
SHA1如何被代表?十進制?十六進制?基地64?散列只是一個非常大的數字,從技術上講,它的每個字符都是一個數字,如果不是正常意義上的「數字」。我認爲在這裏一些例子會非常好。 – 2009-01-22 08:04:26
或者我可能只是在泛泛地想像正常的東西。 – 2009-01-22 08:07:43
FWIW - 近十年後 - 我的`git log`中的所有哈希現在在前三個字符中都有一個字母字母 – galois 2018-02-16 19:35:48