我目前正在開發一個“去散列”腳本,該腳本允許用戶輸入輸入以及散列方法,該腳本遍歷字串列,構建不同長度的字串,并嘗試檢查是否有任何字符散列的組合(長度為 1-8)等于用戶提供的輸入。
例如,用戶提供 'password' 的散列版本,演算法從長度 1 開始考慮所有可能性:
長度 1: a、b、c、d、...、z
長度 2: aa, ab, ac, ..., zz
長度 3: aaa、aab、aac、...、zzz
依此類推,直到達到長度 8(包括它)。
它對所有可能性進行哈希處理,并檢查它們是否等于用戶的輸入。如果是,程式輸出未散列的字串并停止搜索。
我首先考慮使用長度為 1 的 1for()
個回圈,長度為 2 的 2 個嵌套for()
回圈,等等,但我認為我可能會復制和粘貼太多相同的代碼,所以我搜索了一些其他選項,我發現我可以使用itertools。
這就是我生成 n 嵌套for()
回圈的方式:
chars = "abcdefghijklmnopqrstuvwxyz"
ranges = []
for i in range(0, length):
ranges.append(range(0, len(chars)))
for xs in itertools.product(*ranges):
# build the string here, hash it and check if it maches the user's input
我沒有提供完整的實作,因為不僅僅是檢查(如果發現某些內容,則寫入檔案,輸出內容等)。這個想法是,我意識到這個演算法對于長度為 1-4 的效果很好。長度為 1、2 或 3 的字串可以在不到一秒的時間內找到,而長度為 4 的字串也可能需要幾分鐘。
我還“改進”了multiprocessing
每個行程的搜索、使用和搜索兩個長度的組。
問題是,演算法仍然不夠高效。例如,如果我想搜索長度為 5 的字串,我將不得不等待幾個小時,而且我很確定這是一種更有效的方式來實作我實際所做的事情。
還測驗了 n 嵌套正常for()
回圈與這種型別的 itertool 實作的執行時間,發現for()
回圈快了 2 倍。不應該完全相反嗎?
你對如何改進我的演算法有什么建議嗎?
uj5u.com熱心網友回復:
您可以chars
直接用作 的可迭代物件itertools.product
。此外,如果您想要一個可迭代的產品本身,則product
接受一個可選引數。repeat
請參閱檔案。
product
生成元組。要從字串元組中獲取字串,請使用''.join()
.
from itertools import product
def find_password(hashed, length, chars = "abcdefghijklmnopqrstuvwxyz"):
for p in product(chars, repeat=length):
if hash(''.join(p)) == hashed:
return ''.join(p)
return None
password = 'aaabc'
print( find_password(hash(password), len(password)) )
# aaabc
此外,您可以使用from string import ascii_lowercase
而不是硬編碼自己的字母表:
from string import ascii_lowercase
print(ascii_lowercase)
# abcdefghijklmnopqrstuvwxyz
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463767.html
上一篇:烏龜穿越自己的路徑謎題/演算法