Variante criptográfica de quina

22

Cree un programa que imprima la suma MD5 de su fuente en la forma:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Sin trampas: no puede simplemente leer el archivo fuente y calcular su suma. El programa no debe leer ninguna información externa.

Por supuesto, puede usar una biblioteca MD5 disponible para su idioma.

Petr Pudlák
fuente
1
Si alguien logra colisionar MD5 (es decir, h = f (h), donde f es una "sal" cruda para h con todo el código basura que se necesita para imprimir), creo que se les debe permitir hacer eso.
Nick T
1
@NickT Sin embargo, eso sería extremadamente difícil, podría agregar.
PyRulez

Respuestas:

13

Python 157 149

r='r=%r;import md5;print "MD5 sum of my source is: "+md5.new(r%%r).hexdigest()';import md5;print "MD5 sum of my source is: "+md5.new(r%r).hexdigest()

Salida:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

Verificación en ideone

Mate
fuente
Estoy obteniendo un md5sum diferente para el archivo fuente.
skeevey
@slackwear, ¿qué vas a conseguir?
Matt
oh lo has editado de nuevo. Ahora mismo 24ba0a79636297dab8803f571d4e3b44 md.pyuso md5sum en linux
skeevey
1
@slackwear si añado una nueva línea ( \n) al final de mi programa me sale el hash informados: 24ba0a79636297dab8803f571d4e3b44. Estoy bastante seguro de que tiene una nueva línea adicional. (Creo que algunos editores harán esto automáticamente)
Matt
2
Estás en lo correcto. No sabía que vim se escondería de los LF finales
skeevey
12

Python 2, 91 bytes

s="import md5;print'MD5 sum of my source is: '+md5.new('s=%r;exec s'%s).hexdigest()";exec s

Usando la variante de quine de Python que no requiere repetir todo dos veces. Probado en ideone .

Sp3000
fuente
1
esta debería ser la respuesta aceptada
micsthepick
1

Perl + Digest :: MD5, 89 bytes

$_=q(use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex"\$_=q($_);eval");eval

No hay enlace TIO porque Digest :: MD5 no está instalado en TIO. Tenga en cuenta que esto requiere que el nivel de conformidad del idioma se establezca en 5.10 o superior ( -M5.010; esto no conlleva una penalización de bytes de acuerdo con las reglas de PPCG.

Explicación

Este es otro desafío de "imprimir una función del código fuente", lo que significa que se puede resolver trivialmente a través de un constructor universal de quine.

Constructor universal de quine

$_=q(…"\$_=q($_);eval");eval

Usamos la q()notación de cadena (que anida) para inicializar $_, la variable "predeterminada" que Perl usa para los argumentos faltantes. Luego tenemos evalun argumento que falta, para que la cadena dentro del q()se evalúe.

La cadena dentro de q()es una descripción de cómo crear todo el programa; especificamos el resto del programa literalmente, luego usamos un sin escape $_para sustituir toda la cadena por el interior.

La técnica crea así una cadena con contenidos idénticos a la fuente del programa completo; podríamos imprimirlo para producir una quine. Sin embargo, también podemos hacer otras cosas primero, creando un constructor universal de quine.

El resto del programa

use Digest::MD5 md5_hex;say"MD5 sum of my source is: ",md5_hex

Muy simple: importe un MD5 incorporado, luego imprima la cadena fija especificada en la pregunta (no vale la pena comprimirlo, creo que en Perl el descompresor ocuparía más espacio que simplemente indicar la cadena literalmente), y use el MD5 incorporado en la cadena que obtuvimos a través del constructor universal quine.


fuente
0

Node.js REPL (versión 0.9.3), 96 94 bytes

Usando la última versión de Node.js que existía cuando se publicó este desafío. He rastreado la documentación del 9 de noviembre de 2012 para el módulo criptográfico de Node.js, y admitía todas las funciones que he usado aquí en el día.

function x(s){return require("crypto").createHash("md5").update(s+";x(x)").digest("hex")};x(x)

Si no desea instalar una versión antigua de Node.js solo para probar este código, puede estar seguro de que también funciona en la versión más reciente.

Node.js REPL (versión 7.0.0), 81 bytes

Y aquí hay una versión que usa las funciones de flecha de ES6.

x=s=>require("crypto").createHash("md5").update(`x=${s};x(x)`).digest("hex");x(x)

Editar : gracias a Anders Kaseorg por señalar un error en mi versión Node.js 0.9.3, arreglando lo que ahorró dos bytes.

usuario2428118
fuente
Aunque todas las funciones que utilizó pueden haber sido admitidas por Node.js 0.9.3, la sintaxis literal de la plantilla ES6 `${s};x(x)`no lo era.
Anders Kaseorg
@AndersKaseorg Corregido, gracias. Resulta que no usar un literal de plantilla realmente guarda algunos bytes en la versión Node.js 0.9.3.
user2428118