Подтвердить что ты не робот

Регулярное выражение соответствует SHA1

Я пытаюсь сопоставить SHA1 в общем тексте с регулярным выражением.

В идеале я хочу избежать совпадения слов.

Можно с уверенностью сказать, что полный SHA1 имеет отличительный шаблон (они длинные и согласованные длины), поэтому я могу точно их сопоставить - но как насчет сокращенных SHA1?

Можно ли полагаться на наличие чисел?

Глядя на SHA1 в моем журнале фиксации - цифры всегда появляются в первых трех символах. Но это слишком коротко? Сколько символов SHA1 мне нужно рассмотреть, прежде чем я могу предположить, что число появилось бы?

Это не должно быть на 100% точным - мне просто нужно соответствовать сокращенному SHA1 99% времени.

4b9b3361

Ответ 1

Вы можете считать хеши SHA1 полностью случайными, поэтому это сводится к вопросу о вероятностях. Вероятность того, что данная цифра не является числом, равна 6/16, или 0,375. Вероятность того, что три цифры SHA1 не являются числами, составляет 0,375 ** 3 или 0,0527 (5% иш). На шесть цифр это снова уменьшается до 0,00278 (0,2%). При пятизначных числах вероятность того, что все буквы упадут ниже 1% (вы сказали, что хотите соответствовать 99% времени).

Легко создавать регулярное выражение, которое всегда соответствует значениям SHA1:

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

Однако, это может также соответствовать совершенно хорошим пяти буквам, например, "добавлено" или "потушено". В моем файле /usr/share/dict/words есть несколько слов с шестью буквами, которые бы соответствовали: "accede", "beaded", "bedded", "ten", "deface", "efface" и "facade" являются наиболее вероятными. В семи письмах есть только "дедов", которые вряд ли появятся в прозе. Все зависит от того, сколько ложных срабатываний вы можете терпеть, и каковы вероятные слова, с которыми вы столкнетесь на самом деле.

Ответ 2

Что именно вы пытаетесь сделать? Вам не нужно разбирать ничего с выводами git с эвристикой - вы всегда можете запросить именно нужные вам данные.

Если вы хотите совместить полное шестнадцатеричное представление суммы SHA1, попробуйте:

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

То есть слово, состоящее из 40 символов, которые являются либо цифрами, либо буквами a через f.

Если у вас есть только несколько персонажей и вы не знаете, где они, вам не повезло. Является ли "e78fd98" сокращенным идентификатором фиксации? Может быть, но как насчет "1234567"? Это идентификатор фиксации? Номер номера проблемы? Число, из-за которого происходит сбой теста?

Без контекста вы не можете действительно знать, что означают данные.

Чтобы ответить на ваш прямой вопрос, нет свойства SHA1, которое будет делать первые три символа (в шестнадцатеричной форме). Вам просто повезло или, может быть, не повезло, в зависимости от того, как вы на это смотрите.

Ответ 3

Я собираюсь предположить, что вы хотите совместить шестнадцатеричное печатное представление SHA1, а не с эквивалентными 20 необработанными байтами. Кроме того, я собираюсь предположить, что рассматриваемый SHA1 использует только строчные буквы для обозначения шестнадцатеричных цифр. Вы должны будете настроить регулярное выражение, если ваши требования отличаются.

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

Будет соответствовать такой SHA1. Вам нужно будет перевести вышеуказанное регулярное выражение из диалекта egrep в любой инструмент, который вы используете. Поскольку матч должен быть ровно 40 символов, я не думаю, что вам угрожает случайное совпадение слов. Я не знаю никаких 40-символьных слов, которые состоят только из букв от a до f.

изменить:

Еще лучше: используйте Regex для соответствия SHA1, поскольку его решение включает проверку границ слов на обоих концах. Я забыл об этом выше.

Ответ 4

Если у вас есть доступ к репо, вы можете использовать git cat-file -e, чтобы убедиться, что он представляет объект в репо. Это очень быстро. Если вы хотите ограничить это только коммитами и тегами, вы можете использовать git cat-file -t, чтобы узнать тип объекта.

Это может быть использовано, например, для поиска текста, созданного человеком, для упоминания git совершает и генерирует гиперссылки на веб-интерфейс git.

Ответ 5

Для этого типа хэша: 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}$/

Ответ 6

Я использую это в рубине. Он допускает короткую версию ша (6 - 8 в случае столкновений) и для полного шага с длиной в 40 символов.

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