内存和时间昂贵的操作。答案基于关键评论(Wups):
如果使用 对字节进行编码base64
,则结果比输入长。如果你得到这个结果并在一个循环中再次对其进行编码,你就会有指数级的增长。
以下修改后的脚本显示了编码base64
和base32
编码的增长比率:
from base64 import b64encode, b32encode
from random import random as rn
ii = 0
big_number = int(input("The number of encoding layers : "))
30
bool_list = [True if rn() < 0.5 else False for _ in range(big_number)]
sample_text = bytes("lorem ipsum", "utf8")
sample_len = len( sample_text )
current_len = sample_len
for curr_bool in bool_list:
sample_text = b64encode(sample_text) if curr_bool else b32encode(sample_text)
print( ii, curr_bool, len(sample_text), (len( sample_text )/current_len))
current_len = len( sample_text )
ii += 1
** 样本输出**(截断):python .\SO\71009943.py
The number of encoding layers : 30
…
24 True 172320 1.3333333333333333
25 False 275712 1.6
26 True 367616 1.3333333333333333
27 False 588192 1.600017409470752
28 True 784256 1.3333333333333333
29 False 1254816 1.6000081606006202
因此,结果长度大致介于base64和 base32 的复利之间:4/3
1.6
big_number = 30
round( sample_len * (4/3) ** big_number)
# 61596
round( sample_len * 1.6 ** big_number)
# 14621508
对于更大的数字:
big_number = 50
round( sample_len * (4/3) ** big_number)
# 19423591
round( sample_len * 1.6 ** big_number)
# 176763184868
和
big_number = 99
round( sample_len * (4/3) ** big_number)
# 25723354884215
round( sample_len * 1.6 ** big_number)
# 1775296791184759324672