46

一般的なテキストのSHA1を正規表現と一致させようとしています。

理想的には、一致する単語を避けたいと思います。

完全な SHA1 には独特のパターンがあると言っても過言ではありません (それらは長く、一貫した長さです) - したがって、これらを確実に一致させることができます - しかし、短縮された SHA1 はどうですか?

数字の存在を信頼できますか?

コミット ログの SHA1 を見ると、数字は常に最初の 3 文字に表示されます。しかし、これは短すぎますか?数字が現れると仮定する前に、SHA1 の何文字を考慮する必要がありますか?

これは 100% 正確である必要はありません。短縮された SHA1 と 99% の確率で一致する必要があるだけです。

4

6 に答える 6

79

SHA1 ハッシュは完全にランダムであると見なすことができるため、これは確率の問題になります。特定の数字が数字ではない確率は 6/16、つまり 0.375 です。SHA1 の 3 桁がすべて数字ではない確率は 0.375 ** 3、つまり 0.0527 (5% っぽい) です。6 桁になると、これは再び 0.00278 (0.2%) に減少します。5 桁になると、すべての文字が一致する確率は 1% を下回ります (99% の確率で一致させたいとおっしゃいました)。

常に SHA1 値に一致する正規表現を作成するのは簡単です。

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

ただし、これは「追加された」や「色あせた」などの 5 文字の単語と完全に一致する場合もあります。私の/usr/share/dict/wordsファイルには、一致する 6 文字の単語がいくつかあります。「accede」、「beaded」、「bedded」、「decade」、「deface」、「efface」、および「facade」が最も可能性が高いです。7文字で、散文には出てきそうにない「証書」しかありません。それはすべて、許容できる誤検知の数と、実際に遭遇する可能性のある単語が何であるかによって異なります.

于 2009-01-22T08:04:56.440 に答える
41

正確に何をしようとしていますか?ヒューリスティックを使用して git 出力を解析する必要はありません。いつでも必要なデータを正確に要求できます。

SHA1 合計の完全な 16 進数表現に一致させたい場合は、次を試してください。

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

つまり、数字または文字 a ~ f の 40 文字で構成される単語です。

少数のキャラクターしか持っておらず、それらがどこにあるのかわからない場合は、ほとんど運がありません. 「e78fd98」は短縮されたコミット ID ですか? かもしれませんが、「1234567」はどうですか?それはコミットIDですか?問題のチケット番号?テストを失敗させる数字?

コンテキストがなければ、データが何を意味するのかを本当に知ることはできません。

あなたの直接の質問に答えるために、最初の 3 文字 (16 進形式) を数字にする SHA1 のプロパティはありません。見方によっては、あなたはただラッキーなのか、あるいは不運なのかもしれません。

于 2009-01-22T08:15:26.623 に答える
3

リポジトリにアクセスできる場合はgit cat-file -e、リポジトリ内のオブジェクトを表していることを確認するために使用できます。これも非常に高速です。これをさらにコミットとタグだけに制限したい場合は、 を使用git cat-file -tしてオブジェクトのタイプを調べることができます。

これは、たとえば、人間が生成したテキストで git コミットの言及を検索し、git Web インターフェイスへのハイパーリンクを生成するために使用できます。

于 2010-07-02T06:08:31.107 に答える
-2

このタイプのハッシュの場合 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}$/
于 2011-08-28T13:31:32.063 に答える