Skip to content

Instantly share code, notes, and snippets.

@rvcx
Created May 17, 2022 02:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rvcx/a9a7b089cc43c469f0f2eeb3714c81b5 to your computer and use it in GitHub Desktop.
Save rvcx/a9a7b089cc43c469f0f2eeb3714c81b5 to your computer and use it in GitHub Desktop.
def myhash(fs, gs, text):
out = [0] * len(text)
out[0] = gs[(fs[text[0]] + fs[text[-1]]) % 10]
for i in range(1, len(out)):
out[i] = gs[(out[i-1] + fs[text[i]]) % 10]
return "".join(str(d) for d in out)
letters = 'abcdefghijklmnopqrstuvwxyz'
def crack(c):
out = []
s = c * 10
hs = hash(s)
for fc in range(10):
n = ord(hs[0]) - ord('0')
fs = { c: fc }
gs = {}
zi = -1
for i in range(1, len(hs[1:])):
cc = hs[i]
if zi == -1 and cc == '0':
zi = i
gs[(n + fc) % 10] = ord(cc) - ord('0')
n = ord(cc) - ord('0')
if zi != -1:
gps = { v: k for k, v in gs.items() }
for cc in letters:
gfcc = ord(hash(s[:zi + 1] + cc + c)[-2]) - ord('0')
if gfcc in gps:
fs[cc] = gps[gfcc]
out.append((fs, gs))
return out
def merge(a, b, testData):
(afs, ags) = a
(bfs, bgs) = b
fs = afs | bfs
for k, v in fs.items():
if k in afs and afs[k] != v:
return None
gs = ags | bgs
for k, v in gs.items():
if k in ags and ags[k] != v:
return None
if len(fs) == len(letters) and len(gs) == 10:
for s, hs in testData:
if myhash(fs, gs, s) != hs:
return None
return (fs, gs)
data = [(letters, hash(letters))]
o = crack(letters[0])
for l in letters[1:]:
if len(o) == 1 and len(o[0][0]) == len(letters) and len(o[0][1]) == 10:
break
o2 = crack(l)
o3 = []
for a in o:
for b in o2:
m = merge(a, b, data)
if m is not None:
o3.append(m)
o = o3
fs, gs = o[0]
print(hash('hello'))
print(myhash(fs, gs, 'hello'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment