(notonline)-->
include builtins\sha256.e
include builtins\VM\pThreadN.e -- (shd not be rqd on 0.8.1+)
function asHex(string s)
string res = ""
for i=1 to length(s) do
res &= sprintf("%02X",s[i])
end for
return res
end function
sequence starts
constant start_cs = init_cs(), -- critical section
hashes = {x"1115dd800feaacefdf481f1f9070374a2a81e27880f187396db67958b207cbad",
x"3a7bd3e2360a3d29eea436fcfb7e44c735d117c42d1c1835420b6b9942dd4f1b",
x"74e1bb62f8dabb8125a58852b63bdf6eaef667cb56ac7f7cdba6d7305c50a22f"}
procedure find_passwords()
sequence thrashes = {} -- thread-safe copy of hashes
enter_cs(start_cs)
for i=1 to length(hashes) do
thrashes = append(thrashes,thread_safe_string(hashes[i]))
end for
leave_cs(start_cs)
while true do
string pwd
enter_cs(start_cs)
if length(starts)=0 then
leave_cs(start_cs)
exit
end if
pwd = starts[$]&repeat('a',4)
starts = starts[1..$-1]
leave_cs(start_cs)
while length(pwd) do
string hash = sha256(pwd)
if find(hash,thrashes) then ?{pwd,asHex(hash)} end if
for i=5 to 2 by -1 do
if pwd[i]!='z' then
pwd[i] += 1
exit
end if
pwd[i] = 'a'
if i=2 then pwd = "" exit end if
end for
end while
end while
exit_thread(0)
end procedure
for nthreads=4 to 4 do
atom t0 = time()
starts = tagset('a','z',-1)
sequence threads = {}
for i=1 to nthreads do
threads = append(threads,create_thread(routine_id("find_passwords"),{}))
end for
wait_thread(threads)
string e = elapsed(time()-t0)
printf(1,"completed with %d threads in %s\n",{nthreads,e})
end for