對于我大學的密碼學課程,我需要比較許多保存在陣列中的 SHA 哈希。我需要比較陣列索引的值。
陣列中有重復項 - 我已經通過一組陣列的長度與陣列本身的長度之間的比較進行了檢查。
現在我需要有重復值的索引。我找到了很多檢查重復項的解決方案,但僅限于短陣列。我的陣列長度為 300 萬,每個索引中的值都在這個長度附近:864205495604807476120572616017955259175325408501。
我寫了一個嵌套回圈(來自 Java 并試圖學習 python)。這是我的代碼:
counter_outer = 0
while counter_outer < len(hash_value_array):
counter_inner = counter_outer 1
while counter_inner < len(hash_value_array):
if hash_value_array[counter_outer] == hash_value_array[counter_inner]:
print(f"*****FOUND MATCH *****")
print(f"Message [{counter_outer}] Hashvalue has same Value as Message [{counter_inner}]")
safe_index1 = counter_outer
safe_index2 = counter_inner
counter_outer = len(hash_value_array)
break
else:
print("------NO Match-----")
counter_inner = 1
counter_outer = 1
你可以想象......這需要很長時間。
對我來說重要的是,我需要重復項所在的索引- 而不是值。因此,例如,如果索引 100 中有一個 898,索引 1000001 中有一個 898,我只需要作為輸出:100, 1000001
有什么建議?
uj5u.com熱心網友回復:
您可以在 Python 中按照以下方式做一些事情:
假設這個包含 5 個簽名的串列(它們可以是整數或字串,但我有字串):
li=['864205495604807476120572616017955259175325408501',
'864205495604807476120572616017955259175325408502',
'864205495604807476120572616017955259175325408503',
'864205495604807476120572616017955259175325408501',
'864205495604807476120572616017955259175325408502']
您可以制作一個串列字典,每個串列都是重復項的索引:
idx={}
for i, sig in enumerate(li):
idx.setdefault(sig, []).append(i)
然后,您可以像這樣找到重復項:
for sig, v in idx.items():
if len(v)>1:
print(f'{sig}: {v}')
印刷:
864205495604807476120572616017955259175325408501: [0, 3]
864205495604807476120572616017955259175325408502: [1, 4]
如果您li輸入 3,000,000 個條目,那么在我的計算機上運行大約需要 550 毫秒,并且在您的計算機上可能會類似。
但說實話 - 我不明白為什么這要快得多。
您的速度非常慢,因為它具有來自嵌套while回圈的On**2 復雜性。您正在為每個元素回圈整個陣列。我在這里向您展示的方法僅在整個串列中回圈一次——而不是 300 萬次!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368100.html
