1はじめに
数日前、兄と私はいくつかの質問、前方数学ハッシュ衝突や誕生日のパラドックスと関連する利息の問題を取るためにID生成の問題に1つずつ交換します。
今日の話題と共有する記事を書くためにそう感じて、それを研究し、それが面白い見つける慎重に時間を過ごすために二つのことではない印象的なことに、週末を理解する上で、その時点でハッシュ衝突や誕生日のパラドックスがあります。
この記事では、次のことを学びます。
- ハッシュマップの圧縮と競合
- 誕生日パラドックス
- 競合分析のCRC32
2.ハッシュマップの圧縮と競合
ないから、すなわち、ハッシュの数学的性質、単に固定長の文字列を生成する動作に開示されたハッシュ関数を介して様々な長さと入力の形で実現ハッシュ関数であり、このプロセスは、不可逆的な方法であります初期入力のためのハッシュ生成列逆転。
本当に素晴らしいととして有用なサウンドユニバーサルカプセル異なることをたくさんの小さな範囲に建てられたが、1GBの10メガバイトのファイルまたはファイルがあることをハッシュは、固定長の文字列にマップされます後圧縮の可視大きい程度。
しかし、彼らは別の問題を考えなければならなかった:入力は無限大です、結果のハッシュ文字列の長さが固定され、その後、必然的に複数の異なる入力に直面して圧縮された同じハッシュ文字列にマッピングされているマップの無限集合でありますハッシュ衝突の有限集合が引き起こされる、またはハッシュ衝突と呼ばれます。
栗の場合:
2000の入力がある場合は、固定長のバイナリ列は、10ビットを収容できるスペースの、最大数は= 1024 2 ^ 10である10ビットハッシュは、入力の無限集合を話す場合意志少なくとも均一なハッシュ関数を前提に2000-1024 = 976競合があります。
ここを参照してください、きっと誰かが何のハッシュが、圧縮されたマッピングと確かに非常に魅力的な不可逆性の利便性のハッシュは、とても良いアイデアではありません辞めないと言うだろう。
我々は^ 32 2、64 ^約2以上1,800兆、128及び256はさらに大きくなり、約42億であるので、ビット数が拡張する場合32bit-> 64bit-> 128bit-> 256ビットこと、爆発の力を知ります、ここに出て道のように見えますが、私たちは、現在主流のアイデアや方向である、効果的衝突の可能性を低減、電源の追加のスペースの長さが増加します。
要約:
ハッシュ関数自体は、多くの基礎となる実装は非常に複雑な数学的なロジックを持って存在し、均一な分布は、ハッシュ関数の重要な特徴である、Caishuxueqianは、我々は、ハッシュ関数の数学的原理に基づいて、あまりにも多くの研究をしませんでした。
マッピングの圧縮有限集合への無制限の入力セットは避けられない衝突で、衝突を解決するための効果的な方法、マッピング空間の長さを増やすことが後で読むために十分であることを理解することである、と私はスマート読者が作者の意味になりますと信じています。
3.魔法の誕生日のパラドックス
私は多くのビットのハッシュ関数が衝突、それを避けるために何を選択することができています:私たちは、私たちが助けることはできませんが、考えて、ハッシュ衝突の必然性を議論しましたか?
実際には、この問題の顔が、私はそう考え始め:42億スペース、それがあるように32ビットのハッシュ関数を使用して、その後、あなたが最初に、後ろに座るとリラックスすることができますように見える、ハッシュ衝突は42億分の1ではないでしょう生み出します興味深い質問を参照してください。
ネットワークからの写真
誕生日のパラドックスは、50%よりも同じ誕生日の確率大きいの少なくとも二つに下回らない23人を指します。例えば、30人の小学校の授業では、2人の誕生日の70%の同じ確率があります。60人の大規模なクラスでは、確率が99%以上です。原因論理矛盾の観点からは、誕生日のパラドックスは「パラドックス」ではありません。しかし、この数学的な事実は、それがパラドックスと呼ばれ、非常に直感的です。
我々はいくつかの直感的で、どのようにそれは1年365日と同じ誕生日を行うことができますがありますか?しかし、これは事実です。
実際に質問をカウントするには:
うるう年など、考慮に特殊要因の前提を取ることなく、同じクラスの個人がn個あると仮定し、生まれた双子は、平均365日の確率分布と仮定し、少なくとも2人が出産の同じ日にありますどのように多くの計算は確率のですか?
計算と分析プロセス:
私たちは、その反対のイベントを解決するため、対応するn分布を変更する場合、P(n)を発見する確率は、それぞれの人の誕生日で、n個の個々が異なる確率は、N> 365が確率で鳩の巣原理によれば、境界条件を考慮している表し0、N≤365は、確率は次のようになります。
ウィキペディアはまた、一般式を有し、一緒に見て:
ウィキペディアからの写真
この曲線と特定の離散的なデータを見て:
ウィキペディアからの写真
ウィキペディアからの写真
結論:
数N = 23と同じ誕生日の確率の少なくとも二つは50.7パーセントであり、n = 30確率は70%で、nはそれは本当に直感に反すると思われるので、= 50確率は、97%であるが、それは事実です。
衝突の4 CRC32確率
私たちは、一例として、長さCRC32アルゴリズム32でハッシュ衝突の可能性を記述するためにしてみましょう。
简单来想CRC32的空间大小是42亿,但是实际上并不代码40亿左右数据才会出现碰撞,事实这个数据规模并不需要很大就会出现碰撞。
CRC32的碰撞问题本质上可以从生日悖论的角度来分析,相当于计算在有N个输入的情况下出现碰撞的概率。假设现在有K个输入,不出现冲突的概率计算(将42亿用S表示):
- 第一个输入 1/S
- 第二个输入 (S-1)/S
- 第三个输入 (S-2)/S
- ......
- 第k个输入 (S-k+1)/S
这个计算过程和生日悖论基本是一样的,随着K的增加这个概率值下降非常快,笔者在网上找了一份CRC16-CRC64的冲突测试报告,可以看下:
//http://www.backplane.com/matt/crc64.html output.16 Count 18134464/18200000 output.17 Count 18068928/18200000 output.18 Count 17937856/18200000 output.19 Count 17675712/18200000 output.20 Count 17151424/18200000 output.21 Count 16103198/18200000 output.22 Count 14061250/18200000 output.23 Count 10770169/18200000 output.24 Count 7092360/18200000 output.25 Count 4153742/18200000 output.26 Count 2259269/18200000 output.27 Count 1179721/18200000 output.28 Count 603421/18200000 output.29 Count 305089/18200000 output.30 Count 153722/18200000 output.31 Count 77254/18200000 output.32 Count 38638/18200000 output.33 Count 19232/18200000 output.34 Count 9652/18200000 output.35 Count 4914/18200000 output.36 Count 2343/18200000 output.37 Count 1204/18200000 output.38 Count 637/18200000 output.39 Count 302/18200000 output.40 Count 152/18200000 output.41 Count 75/18200000 output.42 Count 52/18200000 output.43 Count 21/18200000 output.44 Count 13/18200000 output.45 Count 7/18200000 output.46 Count 1/18200000 output.47 Count 1/18200000 output.48 Count 1/18200000 output.49 Count 0/18200000 output.50 Count 0/18200000 output.51 Count 0/18200000 output.52 Count 0/18200000 output.53 Count 0/18200000 output.54 Count 0/18200000 output.55 Count 0/18200000 output.56 Count 0/18200000 output.57 Count 0/18200000 output.58 Count 0/18200000 output.59 Count 0/18200000 output.60 Count 0/18200000 output.61 Count 0/18200000 output.62 Count 0/18200000 output.63 Count 0/18200000 output.64 Count 0/18200000
输入时1820w随机数据,上述数据给出了CRCx情况下1820w输入产生的碰撞数量,可以看到在CRC32中出现了38638个冲突,在CRC49中才出现0碰撞,所以冲突率还是很高的。
5.参考资料
- 维基百科-生日悖论
- CRC冲突测试报告