1樓:
我們來乙個暴破法:
from
__future__
import
print_function
from
binascii
import
unhexlify
from
hashlib
import
sha1
from
itertools
import
product
import
string
# 測試純數字集
deftest_123
():foriin
product
(string
.digits
,repeat=20
):src=''
.join(i
).encode
()dst
=sha1
(src).
digest
()assert
len(
src)
==len
(dst
)assert
type
(src)==
type
(dst
)print('
\r',src
,end=''
)ifdst==
src:
(src
)break
# 測試任意位元組串
deftest_any
():foriin
product
('0123456789abcdef'
,repeat=40
):src=''
.join(i
)dst
=sha1
(unhexlify
(src)).
hexdigest
()assert
len(
src)
==len
(dst
)assert
type
(src)==
type
(dst
)print('
\r',src
,end=''
)ifdst==
src:
(src
)break
defmain
():# test_123()
test_any
()if
__name__
=='__main__'
:main
()執行時會發現效率感人,看著資料急速變化卻極難擴充套件,就能深切體會到——哪怕存在這樣的串,我們一輩子也找不到。
2樓:Changlong Wu
下面估計一下有限集合上具有不動點的函式個數,由容斥原理容易知道:
所以隨機取的函式中有
的函式有不動點。
所以MD5有2/3的概率存在MD5(str) == str ...
至於如何找到不定點,可以從乙個點開始迭代,然後通過快慢指標檢測迴圈。這個複雜度是指數級的。也可以分析MD5的代數結構開能否通過代數構造降低複雜度。
3樓:玄星
類似的知乎上有個這個問題,下面已經有人給出了如何求解和問題存在解的概率
是否存在乙個字串,它的md5值是其自身? - 演算法
C語言,用陣列定義乙個字串,那這個字串是怎麼儲存在這個陣列中的呢?
the gc 對於scanf的 s的解釋如下 Matches a sequence of non white space characters the nextpointer must be a pointer to the initial element of acharacter array t...
如何通過只翻轉乙個字串的子串對該字串進行排序?
老版題是NP很多人已經給出參考文獻了。新版題是裸dp 設len是字串strls的長度,那麼定義dp len 1 2 表示直到長度x 0 x len 最後一位strls x 1 不翻轉 翻轉 0 1 所需的最小翻轉次數。 yaoyao 反轉兩個字元的子串不就是交換兩個字元的位置嗎?這是氣泡排序呀 喵的...
python如何統計乙個字串中各字元的數量?
Shreck Ye 其實因為字符集是已知而且連續的,直接按字元編碼對映到乙個記憶體陣列裡面效率要比字典更高。不過既然是Python,變數都是用字典存的,效率似乎就無所謂了,更重要的是怎麼寫更簡單更快。這裡用字典也更方便簡單,參照高讚答案用collections.Counter一行就可以解決更好。 2...