2012-11-24 4 views
1

'text'문자열을 추가하려는 ID 목록이 있습니다. 'text'문자열이 추가 된 후 ID가 'text_compare'문자열과 같은지 확인하고 싶습니다.SHA512 Python이 동일한 문자열에 대해 다른 결과를 생성했습니다.

해시가 발생하기 전의 문자열은 동일하지만 해시가 발생하면 해시가 동일한 결과를 생성하지 않은 것처럼 보입니다. 아래는 내 코드입니다. 파이썬 명령 줄에서 테스트 할 수 있습니다.

import hashlib 
h = hashlib.sha512() 

text = 'beruk makye' 
text_compare = '3beruk makye' 
text_compare_hash = h.update(text_compare) 
text_compare_hash = h.hexdigest() 

ids = [1,2,3] 
texts = [] 
bool_text = [] 
bool_text_hash = [] 

for id in ids: 
    texts.append(str(id) + text) 

for t in texts: 
    if t == text_compare: 
     bool_text.append(True) 
    else: 
     bool_text.append(False) 

for t in texts: 
    h.update(t) 
    t_hash = str(h.hexdigest()) 
    if t_hash == text_compare_hash: 
     bool_text_hash.append(True) 
    else: 
     bool_text_hash.append(False) 

print ids 
# [1, 2, 3] 
print texts 
# ['1beruk makye', '2beruk makye', '3beruk makye'] 
print bool_text 
# [False, False, True] 
print bool_text_hash 
# [False, False, False] 

답변

5

당신의 문제는 동일한 해시 객체를 다시 사용한다는 것입니다. 즉, 계속해서 추가하는 것입니다. 매번 새로운 sha512() 객체를 인스턴스화해야합니다. 아래 코드는 올바르게 작동합니다. 여기

import hashlib 
h = hashlib.sha512() 

text = 'beruk makye' 
text_compare = '3beruk makye' 
text_compare_hash = h.update(text_compare) 
text_compare_hash = h.hexdigest() 

ids = [1,2,3] 
texts = [] 
bool_text = [] 
bool_text_hash = [] 

for id in ids: 
    texts.append(str(id) + text) 

for i in texts: 
    hash = hashlib.sha512(i).hexdigest() 
    print i, hash, hash == text_compare_hash 
+0

덕분에, MD5를 사용하는 동안 동일한 문제가 발생했습니다. 동일한 실수를했습니다. – clarenswd

1

문제는 h가 이미 생성되어 나중에 update() 메소드를 호출하여, 그것을 문자열을 추가 것입니다.

예를 들면 다음과 같이 수정할 수 있습니다.

# ... 
for t in texts: 
    h = hashlib.sha512() # <--- here 
    h.update(t) 
    t_hash = str(h.hexdigest()) 
    if t_hash == text_compare_hash: 
     bool_text_hash.append(True) 
    else: 
     bool_text_hash.append(False) 
# ... 
+0

감사합니다. 나는 update()가 문자열을 추가하는 대신에 그것을 대체 할 것이라고 생각했다. –

+0

@AfifNajib : 아니요, 실제로 문자열을 원래 문자열에 추가하므로 모든 문자열을 한 번에 전달할 필요가 없습니다. 일부 해시는 전체 문자열을 한 번에 알 필요가 없으므로 이미 처리 된 형식으로 저장하기 때문에 이러한 메서드가있을 수 있습니다. 어쨌든'update()'는 기존 해시 객체를 추가 값으로 업데이트하고 새로운 해시를 생성하지 않습니다. – Tadeck

0

당신이 줄 누락 : 새로운 SHA512 해시로 h을 다시 초기화 시간 = hashlib.sha512()

바로 h.update 전 (t)

당신은을 선택하면 python docs (http://docs.python.org/2/library/hashlib.html) 업데이트는 지금까지 hashlib에 주어진 모든 문자열의 요약을 반환한다고 설명합니다. 그래서 귀하의 경우는 해싱 된 문자열은 다음과 같습니다

loop1은 '1beruk makye'

LOOP2 : '1beruk makye2beruk makye'

루프 3 : '1beruk makye2beruk makye3beruk makye'

관련 문제