Para que un hash esté libre de colisiones, cada entrada única tendría que asignarse a una salida única. Si cada salida es única, eso significa que se puede asignar de manera inversa a una entrada única. Eso no sería hash, eso sería solo una codificación. Sin colisiones y la no reversibilidad se excluyen mutuamente por definición.
El punto importante es cómo es probable una colisión, y la respuesta para los hashes modernos es muy poco probable . Si el espacio de la clave de salida es mayor que el espacio de la clave de entrada, es extremadamente improbable que alguna vez encuentre una colisión, e incluso si no lo es, es tan improbable que no valga la pena considerarlo en el mundo real.
Sin embargo, creo que esos identificadores de tarjetas inteligentes no son muy complejos, probablemente números decimales de la misma longitud (por ejemplo, 1234567890). Eso significa que no hay tantas entradas posibles y es probable que se puedan calcular los hashes de todos los identificadores posibles en un tiempo posible, creando una tabla de búsqueda para invertir los hashes. Si ese es el caso, querrás usar un hash lento como bcrypt, scrypt, PBKDF2, etc. para hacer que esto no sea factible.
Cuanto más lo pienso, menos tiene sentido el requisito. El secreto aquí debe estar entre la tarjeta y el lector, y el confianza debe estar entre el lector y el sistema al que está conectado. ¿Por qué es un problema de seguridad si se conoce la identificación de una tarjeta? ¿Qué puede hacer alguien con esta identificación si la obtiene? Si la respuesta es que la identificación es un secreto y alguien puede hacer lo que quiera si conoce el número de identificación, es una mala seguridad. La seguridad aquí debe provenir del hecho de que uno necesita tener posesión física de la tarjeta, lo que significa que todos los secretos se encuentran entre la tarjeta y el lector. Más allá de eso, solo hay un usuario autenticado con un ID, lo cual es una necesidad simple para hacer que el sistema funcione.