2017-04-22 5 views
1

私は次の関数を使用して一意のレコードIDを作成しようとしています:pepperがこのように設定されて hashlib.sha256を使用して一意のIDを作成する。ユニークであることが保証されていますか?

import hashlib 
from base64 import b64encode 

def make_uid(salt, pepper, key): 
    s = b64encode(salt) 
    p = b64encode(pepper) 
    k = b64encode(key) 
    return hashlib.sha256(s + p + k).hexdigest() 

uuid_pepper = uuid.uuid4() 
pepper = str(uuid_pepper).encode('ascii') 

そしてsaltkeyは、リクエストごとに同じ値です。

私の質問は、ペッパーのユニークな性質のため、このインパクトのmake_uidは常にユニークな値を返しますか、それとも重複を作成する可能性がありますか?

suggested answerは、さまざまなuuidタイプの一意性について尋ねているわけではないので、私はsha256ハッシュが2つの異なる入力間で衝突を作成することが可能かどうか疑問だからです。

+0

[いつPythonでuuid.uuid1()とuuid.uuid4()を使用する必要がありますか?](http://stackoverflow.com/questions/1785503/when-should-i-use-uuid- – m0nhawk

+0

@ m0nhawk-私はuuid1またはuuid4を使用すべきかどうか尋ねていませんが、私のhexdigestがこのインスタンスで常に一意であるかどうか尋ねています。 – mwkrimson

+0

あなたがリンクに行き、読んだら、受け入れられた答え**あなたの質問にも**答えを見つけるでしょう。 – m0nhawk

答えて

2

SHA256が一意のハッシュ結果を生成することが保証されているかどうかを知りたいと思います。答えは、はいといいえです。私は私の研究から次の結果を得た。100%正確ではないが近い。

理論上、SHA256は衝突します。それは2^256結果があります。だから、もし我々がハッシュ2^256 + 1回、衝突がなければなりません。さらに悪いことに、統計によると、衝突の可能性はハッシュの以内です99%.

しかし、おそらくあなたの生涯中に生成されません。毎秒10,000ハッシュを計算できるコンピュータがあるとします。 2^130ハッシュを完成させるには、このコンピュータ4 * 10^27年がかかります。この数字がどれくらい大きいか分からないかもしれません。ハッシングを行う年数は地球上に人間のそれの数の2 * 10^22倍です。これは、私たちが今まで地球上にいた最初の日以来、ハッシュを始めたとしても、衝突の可能性はまだ非常に小さいことを意味します。

あなたの質問にお答えします。

+0

はい、これは私が探していた答えです。理論的には、別個の入力と衝突する可能性があります。それはまったく起こりそうもないようですが、まだ可能です。ありがとう! – mwkrimson

関連する問題