¿Es posible precomputar un hash de commit de git para que se pueda colocar en el commit?

Estaba a punto de eliminar una function de un administrador del sitio que no creo que nadie esté usando. Sin embargo, quería dejar un post sobre la posibilidad de que alguien todavía lo esté usando. Iba a replace la plantilla HTML con algo en el sentido de:

<p>This feature has been disabled. If you need it back please ask engineering to revert #1234567890abcdef<p> 

Obviamente, me doy count de que esto se puede hacer fácilmente en dos commits. Sin embargo, pensé que era una pregunta interesante desde un ángulo de cryptography.

Suponiendo que solo puede modificar el hash en sí, ¿cuáles son las posibilidades de que realmente exista un hash que satisfaga esta propiedad? A medida que acorta el hash (dado que git permite prefijos únicos), es de suponer que aumenten las posibilidades de dicho hash. ¿Cuál sería la probabilidad de un prefijo de 6 caracteres y qué tan difícil sería encontrarlo?

Este script hace algo similar con hashes cortos.

Es fácil calcular la probabilidad, suponiendo que la function hash (SHA-1) está distribuida uniformemente (que es una especie de punto). Aquí hay un ejemplo de hash SHA-1:

 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33 

40 caracteres 4 bits por personaje 2^(number-of-characters * 4) posibilidades.

Entonces, si quieres los primeros 7 nibbles (caracteres hexadecimales) del SHA-1, estás viendo 2^(7*4) == 1/268435456 posibilidad de encontrar el hash correcto. (¡que no debería ser demasiado difícil para un script, como puedes ver!)

Puede hacer esto si el hash:

  1. Es corto. Simplemente intente muchas veces hasta que la propiedad se cumpla. El costo es 2 ^ n para un hash de n bits. Los 160 bits de SHA-1 son demasiado largos para que esto funcione. Puede hacer esto para los primeros dígitos del hash. Aproximadamente 8-12 dígitos hexadecimales (32-48 bits) deberían ser factibles sin demasiado esfuerzo.
  2. El hash tiene una estructura matemática que permite esto. CRCs y hashes similares funcionan así. No es posible con hashes criptocharts típicos como SHA-1.

En resumen, no puede tener una confirmación que contenga su propio hash.

Sugeriría usar tags ( http://git-scm.com/book/es/Git-Basics-Tagging )

Consulte https://en.wikipedia.org/wiki/Avalanche_effect para tratar de hacer esto con el hash

puede get el hash de un object con git hash-object <fileName> eche un vistazo a esta publicación ¿Cómo asignar un Git SHA1 a un file sin Git?

Aunque no creo que lo que quieras hacer sea posible. La edición del file cambiará el hash del file. Entonces, si calcula el hash y pone ese valor en el file, el hash del file ahora ha cambiado. Por lo tanto, el hash que ha guardado en el file no será el hash correcto.