加密奎因变体


22

创建一个程序,以以下格式打印其源的MD5和:

MD5 sum of my source is: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

没有作弊-您不能只读取源文件并计算其总和。该程序不得读取任何外部信息。

当然,您可以使用适用于您的语言的MD5库。


1
如果有人设法碰撞MD5(即h = f(h),其中f是h的粗略“盐”,其中包含所有需要打印的代码垃圾),我认为应该允许他们这样做。
尼克T

1
@NickT但是,我可能会补充说,这将非常困难。
PyRulez 2015年

Answers:


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()

输出:

MD5 sum of my source is: bb74dfc895c13ab991c4336e75865426

ideone上的验证


我为源文件得到了不同的md5sum。
skeevey 2012年

@slackwear你得到什么?
马特

哦,您再次编辑了它。现在我可以24ba0a79636297dab8803f571d4e3b44 md.py在linux中使用md5sum
skeevey 2012年

1
@slackwear,如果我\n在程序末尾添加换行符(),则会得到您发布的哈希值:24ba0a79636297dab8803f571d4e3b44。我相当确定您还有多余的换行符。(我相信某些编辑器会自动执行此操作)
Matt

2
你是对的。我没有意识到vim会隐藏尾随的LF
skeevey 2012年

12

Python 2,91个字节

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

使用不需要重复两次所有操作的Python quine变体。经ideone测试。


1
这应该是公认的答案
micsthepick

1

Perl + Digest :: MD5,89个字节

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

没有TIO链接,因为在TIO上未安装Digest :: MD5。请注意,这要求将语言一致性级别设置为5.10或更高(-M5.010;根据PPCG规则,这不会带来字节损失。

说明

这是另一个“打印源代码的功能”挑战,这意味着可以通过通用quine构造函数轻松解决它。

通用quine构造函数

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

我们使用q()字符串表示法(嵌套)来初始化$_,这是Perl用于缺少参数的“默认”变量。然后,我们eval使用一个缺少的参数,以便对内部的字符串q()进行求值。

里面的字符串q()描述了如何创建整个程序。我们从字面上指定程序的其余部分,然后使用未转义的内容$_将整个字符串替换为内部。

因此,该技术创建的字符串的内容与整个程序的源相同;我们可以将其打印出来以制作一个奎纳。不过,我们还可以先做其他事情,制作一个通用的quine构造函数。

该程序的其余部分

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

非常简单:导入一个内置的MD5,然后打印问题中指定的固定字符串(不值得对其进行压缩,我相信在Perl中,解压缩器将比仅字面说明该字符串占用更多的空间),并使用内置的MD5我们通过通用quine构造函数获得的字符串。


0

Node.js REPL(版本0.9.3), 96 94字节

使用发布此挑战时存在的最新版本的Node.js。我已经跟踪了2012年11月9日有关Node.js加密模块的文档,它确实支持我在这里曾经使用的所有功能。

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

如果您不想安装旧版本的Node.js只是为了测试此代码,请放心,它也可以在最新版本中使用。

Node.js REPL(版本7.0.0),81个字节

这是使用ES6箭头功能的版本。

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

编辑:感谢Anders Kaseorg指出我的Node.js 0.9.3版本中的一个错误,该错误修复了节省了两个字节的问题。


尽管Node.js 0.9.3支持您使用的所有功能,但ES6模板文字语法`${s};x(x)`不支持。
Anders Kaseorg

@AndersKaseorg固定,谢谢。事实证明,不使用模板文字实际上在Node.js 0.9.3版本中节省了一些字节。
user2428118
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.