1

文字列「text」を追加したいIDのリストがあります。('text'文字列が追加された後の)IDのいずれかが文字列'text_compare'と等しいかどうかを確認したいと思います。

奇妙なことに、ハッシュが行われる前の文字列は同じですが、ハッシュが行われた後は、ハッシュによって同じ結果が得られなかったようです。以下は私のコードです。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]
4

3 に答える 3

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
于 2012-11-24T04:09:25.083 に答える
1

ここでの問題は、hすでに作成されており、後でメソッドを呼び出して文字列を追加update()することです。

これを修正するには、たとえば次のようにします。h新しいsha512ハッシュとして再初期化します。

# ...
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)
# ...
于 2012-11-24T04:09:45.200 に答える
0

次の行がありません:h = hashlib.sha512()

h.update(t)の直前

python docs(http://docs.python.org/2/library/hashlib.html)を確認すると、更新により、これまでにhashlibに指定されたすべての文字列のダイジェストが返されることが説明されています。したがって、あなたの場合、ハッシュしている文字列は次のとおりです。

loop1: '1beruk makye'

loop2: '1beruk makye2beruk makye'

loop3: '1beruk makye2beruk makye3beruk makye'

于 2012-11-24T04:19:48.370 に答える