나만의 해시 함수를 만들어보자.
def hash(S):
numbering = ''.join(list(map(str, list(map(ord, S)))))
length = 1
numbering = [numbering[0 + i:length + i] for i in range(0, len(numbering), length)]
result = []
while len(numbering) >= 2:
n = numbering.pop()
m = numbering.pop()
result.append(int(m + n))
result2 = []
for i in range(len(result)):
k = str(result[i] ** 2)
p = k[len(k)//2-3:len(k)]
result2.append(result[i])
u = str(result[i] ** 2)
try: result2.append(int(u[len(u)//2-2:len(u)//2]))
except: pass
try: result2.append((result[i] ** 2) % int(u[len(u)//2-2:len(u)//2]))
except: pass
result2.append(int(u[0] + u[-1]))
result2.append(result[i] ** 2)
return ''.join(list(map(lambda x : x[2:], list(map(hex, result2)))))
순정이 제일 좋은거다... 로직만 생각하면서 짧은 코드로 회귀
i번째 값과 i-1번째 값을 제곱하여 잘라주는 매우 간단한 방법으로 시도
def string_hash(a):
n = list(map(ord, a))
r = []
for i in range(len(n)):
r.append(str(hex(n[i] ** n[i-1]))[2:18])
return ''.join(r)
i번째 값과 i-1번째 값을 곱하는 간단한 로직 작성.
def string_hash(a):
n = list(map(ord, a))
r = []
s = 1
for i in range(len(n)):
s *= n[i] * n[i-1]
return s
while True:
s = input()
print(string_hash(s))
비트 시프트 연산자를 써보자고 생각했음.
그리고 DP처럼, 저번에 연산한 값을 기준으로 새로운 연산을 도출하면
차이점이 구분될 것이라고 판단함.
def string_hash(a):
n = list(map(ord, a))
hash_val = 13290570137
for char in n:
hash_val = ((hash_val << 2) * hash_val) << 4 + char
queue = list(str(hash_val))
forwards = queue[:len(queue)//2]
backwards = queue[len(queue)//2:]
queue = []
for i in range(len(queue)//2-1):
queue.append(forwards[i] * backwards[i])
return str(hash_val)[:32]
while True:
s = input()
print(string_hash(s))
길이도 동일하게 잘 나오고, 위치만 다른 글자나 똑같은 글자를 여러번 넣었을 때도
고유하게 나온다!!
코딩하면서 어떻게 hash가 생성될지 궁금했지만 넘어갔던 저와 달리 직접 구조를 만들어보실 생각을 하셨다는게 대단하신 것 같습니다