Devo trovare gli hash SHA256 di 2^25 stringhe casuali. E poi cerca la collisione (usando il paradosso del compleanno per l'ultimo, diciamo, solo 50 bit dell'hash).Come gestire una variabile dict con 2^50 elementi?
Sto memorizzando la stringa: hash pair in una variabile dict. Quindi ordina la variabile con i valori (non le chiavi) e quindi cerca la collisione usando un ciclo O (n).
Il problema è che poiché ci sono 2^25 stringhe e i loro 2^25 hash, quindi la variabile dict ha 2^50 valori al suo interno. Questo è ESTREMAMENTE intenso in termini di risorse. Quindi, come faccio a farlo con RAM limitata, ad esempio, circa 1 GB?
Cosa ho già provato:
1. Esecuzione con uno spazio di scambio da 6 GB. Il programma si è svolto durante la notte e non è stato ancora completato. Questo è essenzialmente ancora più lento di una ricerca O (n_square)! Gli hash vengono calcolati con l'utilizzo della RAM di circa 3,2 GB. Ma dopo, quando si tratta del comando sort, la RAM utilizzata inizia a sparare di nuovo! Ho anche se il pitone sorta usi in-Place-Quicksort :(
2. Ho conservato solo gli hash e ha trovato una collisione. Ma non sono riuscito a trovare la stringa corrispondente in quanto non conservarlo.
io non dovrei uso database ecc. Al massimo un file di testo ma non aiuta.Inoltre, sono abbastanza nuovo per Python ma non mi permetto di limitare il livello della tua risposta
PS: questo è un compito. aver trovato le collisioni in meno di un minuto con 300 MB di RAM.Non so se questo è vero.Ho risolto il problema ma la risposta è irraggiungibile! Al lavoro quindi non ho accesso al codice adesso.
Codice:
from Crypto.Hash import SHA256
import os
import random
import string
from operator import itemgetter
def shaa():
trun=[]
clist={}
for i in range(0,33554432):
sha=SHA256.new(str(i)).hexdigest()
sha=int(bin(int(sha,16))[-50:],2)
clist[i]=sha
print 'Hashes done.'
clist=sorted(clist.items(), key=itemgetter(1))
for i in range(0,33554432):
if(clist[i]==clist[i+1]):
#print string[i],string[i+1]
print clist[i]
return 1
return 2
result=2
while(result==2):
result=shaa()
Non è così male, poiché 2^25 + 2^25 = 2^26 – sth
Se si cercano collisioni di hash, suggerirei di eseguire invece l'hash di dict: string. Quindi, quando provi ad inserire una nuova coppia, puoi banalmente vedere se l'hash è già presente e recuperare la stringa colliding corrispondente. –
Non dovresti usare un database? Neanche il modulo 'anydbm'? Strana esigenza, anche se penso che ci sia una soluzione migliore. –