如何使用Python寫一個指令碼,能輸出該指令碼自身的MD5值?
沒有限制條件的話,直接開啟 argv[0] 就可以算 MD5 了。
#!/usr/bin/python3
import
hashlib
import
sys
with
open
(
sys
。
argv
[
0
],
‘rb’
)
as
selfsrc
:
(
hashlib
。
md5
(
selfsrc
。
read
())
。
hexdigest
())
輸出結果:
$ 。/selfsum。py
80a8e241515e133ad74000be03ec0ca6
$ md5sum selfsum。py
80a8e241515e133ad74000be03ec0ca6 selfsum。py
CodeGolf 裡面有這個題,排名第一的答案是:
r
=
‘r=
%r
;import md5;print “MD5 sum of my source is: ”+md5。new(r
%%
r)。hexdigest()’
;
import
md5
;
“MD5 sum of my source is: ”
+
md5
。
new
(
r
%
r
)
。
hexdigest
()
其實就是 Quine 構造修改了一下。
這題太簡單了,來個難點的:
如何構造一個字串,使其包含自身的MD5值?
利用 Quine 改了一個, 足夠囉嗦 (檔案末尾有換行符):
import
hashlib
x
=
[
“import hashlib”
,
“”
,
“x = [”
,
“ ”
,
“]”
,
“”
,
“def quine(x):”
,
“ s = []”
,
“ for i in range(3):”
,
“ s。append(x[i])”
,
“ for i in range(17):”
,
“ s。append(x[3] + chr(34) + x[i] + chr(34) + ‘,’)”
,
“ for i in range(4, 17):”
,
“ s。append(x[i])”
,
“ return chr(10)。join(s) + chr(10)”
,
“”
,
“print(hashlib。md5(quine(x)。encode())。hexdigest())”
,
]
def
quine
(
x
):
s
=
[]
for
i
in
range
(
3
):
s
。
append
(
x
[
i
])
for
i
in
range
(
17
):
s
。
append
(
x
[
3
]
+
chr
(
34
)
+
x
[
i
]
+
chr
(
34
)
+
‘,’
)
for
i
in
range
(
4
,
17
):
s
。
append
(
x
[
i
])
return
chr
(
10
)
。
join
(
s
)
+
chr
(
10
)
(
hashlib
。
md5
(
quine
(
x
)
。
encode
())
。
hexdigest
())
自己讀自己的原始碼檔案,生成md5