1º SHA-1 genera hashes o claves de 20 bytes... esto quiere decir que como mucho puede producir 256^20 claves diferentes, sin ningun tipo de colisión.
Ahora mismo no estoy seguro que sea exactamente así, pero para lo que preguntas es trivial.
2º si construimos cadenas (o arrays, mal usada la palabra cadenas) de 20 bytes exactos, realizando todas las combinaciones posibles, ocuparemos exactamente todas las claves generadas de SHA-1, ya que estas son también 256^20..
Si tomas la calculadora y hechas cuentas, verás que arroja un resultado de 48 cifras, esto significa que computacionalmente hablando una rutina que tarde 1 msg. tardaría 1*10^45 segundos... es decir 1*10^41 horas * 4, es decir 1'69 * 1*10^40 días, es decir: 4'63 *1*10^37 años, es decir: 463439129036942833017403866284,97 millones de siglos. incluso aunque redujeras esa rutina de 1 milisegundo a una millonésima de segundos no tendría apensa sconsecuencias..
3º si no se ha producido colisión, cosa bastante curiosa, pero que demostraría una gran pericia, obviamente se producirá con cadenas de 21 caracteres... es mas... si no hay colisión con 20 bytes, hay colisión al menos entre una cadena de 20 y una cadena de 21...
si yo tomo cadenas de 256 caracteres, y tu me envías cadenas de de 264 caracteres una de 2 o arroja error de tipo de datos o en el mejor de los casos, tomando los datos secuencialmente, sólo tomo los enésimos 256 caracteres , de modo que si tu has enviado cadenas de 264 caracteres, se va truncando en cadenas de 256...
¿entonces porqué se pone siempre en juicio el hecho de que no haya colisiones en un algoritmo? en arrays de bytes cuya longitud sea superior a la del hash siempre habra colision... no?
Sólo si yo no aprovechara el rango completo del tipo de datos que estoy utilizando pero al momento de comparar truncara el exceso. Me explico si el número mayor de mi tipo de datos que utilizo en x función fuera 4096.... pero mi rango máximo fuera 999, parece razonable suponer que tanto 999 como 1999, como 2999 y 3999 dieran positivo pero cuando yo establezca una igualdad se pierde y sólo valida con 999, a excepción de que validadra con 'x mod 1000' en cuyo caso entrarían los anteriormente descritos. Por eso siempre se aprovecha el rango completo del tipo de datos que manejas, porque para eso tiene su límite.
nota: puedes aplicar los mismos razonamientos con los números negativos caso de ser numérico y no de cadenas el valor...
saludos...