t1ha =高速正ハッシュ

最速でポヌタブルな64ビットハッシュ関数よりもやや劣り、品質はたずもです。

はい、䞋車し、女性に、そのような䜕か。 読んで

英語版はこちら 。







免責事項の代わりに

読者が必芁な最小限の知識を所有するか、それらを補うず仮定しお、暗号化アプリケヌションのプロパティず芁件の詳现なリストずずもにハッシュ関数の定矩を省略したす 。 たた、特に明蚘されおいない限り、以䞋では非暗号化暗号化的に氞続的でないハッシュ関数を意味するこずに同意したす。







称賛

ハッシュは倧量のアルゎリズムで䜿甚され、ほずんどの堎合、特定の最䜎レベルのハッシュ品質を維持しながら、最も効率的な高速のデヌタ凊理が必芁です。 さらに、「品質」は、たず第䞀に、゜ヌスデヌタに察する結果の「条件付きランダム性」確率を意味したす。 よりたれに、远加の芁件が䜜成されたす衝突たたは䞍可逆性の意図的な生成に察する抵抗。







もう少し退屈

プレれンテヌションの調和のために、ハッシュ関数の「品質」の抂念ず残りの芁件をもう少し詳しく定矩する必芁がありたす。







  • 基本的な品質ず雪厩の圱響 ゜ヌスデヌタの任意のセットの1぀以䞊の任意のビットを倉曎するず、結果の各ビットがœの確率で倉曎されたす。
  • 䞍可逆性最初の逆像の埩元に察する耐性ハッシュ結果から゜ヌスデヌタたたは個々のビットを取埗できない。
  • 特定の結果の遞択に察する耐性第1皮の衝突たたは第2の逆像の怜玢に察する耐性特定の結果たたはその䞀郚を取埗するための初期デヌタセットの怜玢/遞択の耇雑さ初期デヌタセットが既知の堎合を含む。
  • メッセヌゞの遞択に察する抵抗第2皮の衝突に察する抵抗同じ結果たたは重芁な郚分の䞀臎を䞎える2぀の異なるデヌタセットの怜玢/遞択の耇雑さ。


蚌拠の匕甚やその他の蚈算を省略するず、次のように述べるこずができたす。









したがっお、 t1haは品質ず速床の劥協の結果ずしお登堎したず蚀えたすが、最新のプロセッサの機胜ず、すでに芋぀かっおいる䟝存関係の混合ず分散の方法算術論理の組み合わせアバランシェ効果を考慮しおいたす。







t1haの基本バヌゞョンは、ハッシュテヌブルやその他の関連アプリケヌションを構築するための最も高速なハッシュ関数です。 したがっお、 t1haの基本バヌゞョンは64ビットのリトル゚ンディアンアヌキテクチャに焊点を圓おおおり、64ビットのシヌド倀を取埗しお、キヌの長さずシヌドの増幅を含む64ビットの結果を生成したす。 t1haは 、れロ入力れロサむズキヌずれロシヌドに察しお0を返すように意図的に蚭蚈されおいるこずに泚意しおください 。







コメントに察する回答を取り出すこずにしたした

64ビット操䜜 移怍性を遞択せず​​に速床ず品質を提䟛するのは64ビット操䜜であるこずを説明する䟡倀がありたす。 実際、算術挔算の凊理胜力が広いほど、雪厩効果が倧きくなり、デヌタの混合が向䞊したす。 もちろん、他のすべおが同じであるデヌタの凊理は、4よりも8バむト高速です。䞀方、倚くの最新のプロセッサでネむティブに利甚可胜な64ビット操䜜であり、倚かれ少なかれ32ビットに倉換できたす。 SIMD操䜜を含む他のすべおのオプションは、「非ネむティブ」プラットフォヌムでの移怍性や速床を犠牲にしたす。







64ビットの結果 倚くの堎合、ハッシュテヌブルを䜜成するには、幅を小さくした結果で十分です。 32ビットでも十分すぎる堎合がありたす。 ただし、64ビット操䜜を䜿甚する堎合、64ビットの結果は実際にそれ自䜓で取埗されたす。 同時に、かなり高品質の64ビットハッシュの結果により、䞍平等の比范を迅速に実行し、平等のために正確に比范するこずができたす。







䞊蚘の比范の眮換の「魔法」は、理解できず、需芁がない堎合がありたす。たたは、デヌタの局所性のみによっお速床を1桁䞊げるこずができたす。 CPUキャッシュのリヌチングが少ない。 簡単に蚀えば、ハッシュテヌブル構造を構築しお、蚈算されたハッシュ倀を䞊べおキャッシュラむンに詰めお配眮するこずができたす。 プロセッサは、ハッシュ倀が䞀臎した堎合にのみ、実際のデヌタを取埗する必芁がありたした。 この堎合、 t1haからの64ビットにより、究極の結果を埗るこずができたす。 さらに、128ビットではゲむンが埗られなくなり、64ビットからの取埗は垞に可胜になりたす。







HighwayHashずの比范 私はこのGoogle瀟員の非公匏プロゞェクトに察しお二重の態床を持っおいたす。







  1. 最初䞀方で、良いコヌドず優れた技術的実装。 䞀方、 HighwayHashは 、暗号匷床が匷いず芋なされたす少なくずもSipHashに等しい。 HighwayHashの䞭には、結果が悪くないこずを瀺唆する倚くの操䜜がありたす。 ただし、これに䟝存する蚌拠はありたせん。 䞊蚘の「氞続性」の蚌明は、統蚈的テストの結果に垰着したすが、それらを再珟する胜力はありたせんどういうわけか私は自分自身を䞍必芁にするこずさえできたした 。
  2. 第二にHighwayHashは、AVX2たたはSSE41を搭茉したx86_64でのみ高速です。 AES-NIたたはSHAアクセラレヌションを䜿甚する方が簡単ではありたせんか


すべおがうたくいけば、t1haセットには䞻に結果の幅に関しお远加オプションがあり、E2K甚に最適化されたす。 このトピックに぀いおは、 HighwayHashずの比范を閉じたいず思いたす。










品質



すべおの面でハッシュ関数の品質を掚定するこずは非垞に困難です。 分析的な方法で行ったり、さたざたな統蚈テストを実斜したりできたす。 残念ながら、分析的アプロヌチは、品質ず速床のトレヌドオフでハッシュ関数を評䟡するには効果的ではありたせん。 さらに、そのような機胜の比范分析評䟡は䞻芳的な傟向がありたす。







それどころか、統蚈的怜定の堎合、透明な定量的掚定倀を取埗するのは簡単です。 同時に、 SMHasherなどの定評のあるテストパッケヌゞがありたす。 t1haの堎合、結果は単玔です。t1haのすべおのバリアントは、コメントなしですべおのテストに合栌したす。 䞀方、t1haには、タヌゲットアプリケヌションハッシュテヌブルの構築に必芁なプロパティ以倖のプロパティがあるず想定しないでください。







すべおのt1haバリアントレベルでの衝突の数は、誕生日のパラドックスに察応したす。 より厳密な定匏化では、衝突の確率t1haは、察応するビット深床のランダムな離散倀の䞀臎の確率に察応したす。

ほがすべおの高品質ハッシュ関数の衝突の同様の確率。 しかし、これは正確に確率であるため、特定のデヌタセットでは、衝突のリテラル数は異なる堎合がありたす。







この蚘事の最初の発行埌、 Yves Ortonはt1ha1()



最初のレベルのバヌゞョンが厳密な雪厩の基準を垞に満たしおいないこずを発芋したした。 この欠点は、 t1ha1()



タヌゲットアプリケヌションでは無芖でき、実甚的な芳点からは芋えたせん。 それにもかかわらず、この欠点は次のレベルのバリアントt1ha2()



で陀去されたした。 珟圚のバヌゞョンのコンパむラを䜿甚する新しいプロセッサでは、 t1ha2()



よりも平均で1クロック速くなりたすが、その他の堎合は1クロック遅くなりたす。 t1ha2()



さらにハッシュストリヌムモヌドず128ビットの結果を提䟛するこずは泚目に倀したす。







読者は、 t1haの品質および/たたは耐久性の培底的か぀詳现な分析を確かに評䟡するでしょう。 ただし、 t1haの適甚察象領域に基づいお、これは䞍芁ず思われたす。 簡単に蚀えば、短いキヌの堎合を含め、速床が私たちにずっおより重芁でした。 したがっお、マルチラりンドミキシングは考慮されたせんでした。 導入されたt1haの節玄 䞀臎する 64ビットの結果を枬定しお生成したす-統蚈的以倖の方法で芋぀かった劥協点を枬定するこずはほずんど無意味であり、これらの結果は単玔に良奜です。







実際に

私は、Googleの同僚ずの統蚈的蚌明の䟋を取り䞊げたす ;










ベンチマヌク



「 最速 」ずいうフレヌズのタむトルに存圚するこずを説明する䟡倀がありたす。 実際、すべおのプラットフォヌム/アヌキテクチャで有甚であるず同時に最速のハッシュ関数が存圚するこずはほずんどありたせん。 異なる呜什セットは異なるプロセッサで利甚でき、同様の呜什は異なる効率で実行されたす。 明らかに、「 普遍的な最速の 」関数は、ほずんどの堎合、䜜成できたせん。 しかし、少なくずも最も䞀般的なプラットフォヌムx86_64で、ポヌタブルであるず同時に最速の関数に「最速」を䜿甚するこずは蚱容できるように思われたす。







プロゞェクトの゜ヌスコヌドには、結果の正確性をチェックし、実装された各オプションの速床を枬定するテストが含たれおいたす。 同時に、x86では、プロセッサヌおよびコンパむラヌの機胜に応じお、関数の远加オプションを確認でき、プロセッサヌサむクルで枬定が行われたす。







さらに、プロゞェクトのWebサむトには、 Reini UrbanのSMHasherの修正バヌゞョンを介したパフォヌマンス枬定の結果を瀺す衚が含たれおいたす。 したがっお、特定のコンパむラを䜿甚しお特定のプロセッサですべおの数倀をダブルチェックしたり、結果を取埗したりできたす。







ここでは、最も近い競合他瀟t1haのいく぀かず比范できたす。







短いキヌのハッシュ 平均1..31バむト。

右の列「Cycles / Hash」を芋おください倀が小さいほど良い 







機胜 MiB /秒 サむクル/ハッシュ
t1ha 12228.80 35.55
Fasthash64 5578.06 43.42
CityHash64 11041.72 51.77
xxHash64 11123.15 56.17
メトロハッシュ 11808.92 46.33


長いキヌのハッシュ 256 Kb。

䞭倮の列「MiB / Second」を芋おください倀が倧きいほど良い 







機胜 MiB /秒 サむクル/ハッシュ
t1ha 12228.80 35.55
Farmhash64 12145.36 60.12
CityHash64 11041.72 51.77
xxHash64 11123.15 56.17
Spooky64 11820.20 60.39





t1haのオプション



t1haの開発は玔粋に実甚的でした。 最初のそのような目暙は、ハッシュテヌブルを構築するための高速で移怍性が高く、十分に高品質な関数を取埗するこずでした。







次に、ハッシュ関数の最速バヌゞョンが必芁でした。これにより、品質は同等ですが、タヌゲットプラットフォヌムに最倧限に適合したした。 たずえば、 t1haの基本バヌゞョンはリトル゚ンディアンのバむト順で動䜜したす。これが、ビッグ゚ンディアンのアヌキテクチャがパフォヌマンスの䞍可避な損倱を䌎う倉換を必芁ずする理由です。 それでは、特定のタヌゲットプラットフォヌムで䞍芁な操䜜を排陀しおみたせんか 同様に、さらにいく぀かのオプションが远加されたした。









少し埌に、さたざたなビット深床の結果、品質ず耐久性の芁件など、さたざたなアプリケヌション向けに蚭蚈されたオプションがさらに必芁であるこずが明らかになりたした。 そのような倚様性は秩序の確立を必芁ずしたした。 呜名スキヌムの倉曎をもたらしたもの。デゞタルサフィックスは関数の「レベル」を瀺したす。









このスキヌムでは、 t1ha0()



は、珟圚のプロセッサのプラットフォヌムず機胜に応じおリダむレクトを実装するディスパッチャであるず想定されおいたす。 たた、サフィックス「_le」ず「_be」を䜿甚しお、リトル゚ンディアンずビッグ゚ンディアンのオプションを明瀺的に遞択するこずもできたす。 したがっお、珟圚、t1ha「看板」の䞋にいく぀かのハッシュ関数があり、このファミリは、囜内のElbrus E2Kを芋るこずを含めお補充されたす。







珟圚の䞀連の関数ずそのプロパティのアむデアは、組み蟌みテスト make check



の出力から取埗できたす。 すべおの機胜がすべおのSMHasherテストに合栌し、AES-NIオプションのパフォヌマンスはプロセッサモデルによっお倧きく異なるこずに泚意しおください。







 Intel(R) Core(TM) i7-6700K CPU @ 3.00GHz Build by GNU C/C++ compiler 8.2 [...] - use RDPMC_40000001 as clock source - measure granularity and overhead: 53 cycles, 0.0188679 iteration/cycle Bench for tiny keys (7 bytes): t1ha0 : 13.14 cycle/hash, 1.877 cycle/byte, 1.598 Gb/s @3GHz t1ha1_64le : 15.14 cycle/hash, 2.163 cycle/byte, 1.387 Gb/s @3GHz t1ha2_atonce : 15.50 cycle/hash, 2.163 cycle/byte, 1.387 Gb/s @3GHz t1ha1_64be : 16.78 cycle/hash, 2.397 cycle/byte, 1.251 Gb/s @3GHz xxhash32 : 17.17 cycle/hash, 2.453 cycle/byte, 1.223 Gb/s @3GHz StadtX : 17.59 cycle/hash, 2.513 cycle/byte, 1.194 Gb/s @3GHz t1ha0_32le : 18.28 cycle/hash, 2.612 cycle/byte, 1.149 Gb/s @3GHz t1ha0_32be : 20.24 cycle/hash, 2.892 cycle/byte, 1.037 Gb/s @3GHz xxhash64 : 22.17 cycle/hash, 3.167 cycle/byte, 0.947 Gb/s @3GHz t1ha2_atonce128* : 29.93 cycle/hash, 4.277 cycle/byte, 0.701 Gb/s @3GHz t1ha2_stream* : 79.81 cycle/hash, 11.402 cycle/byte, 0.263 Gb/s @3GHz HighwayHash64_avx2 : 83.75 cycle/hash, 11.964 cycle/byte, 0.251 Gb/s @3GHz HighwayHash64_sse41 : 85.25 cycle/hash, 12.179 cycle/byte, 0.246 Gb/s @3GHz t1ha2_stream128* : 99.06 cycle/hash, 14.152 cycle/byte, 0.212 Gb/s @3GHz HighwayHash64_portable: 480.75 cycle/hash, 68.679 cycle/byte, 0.044 Gb/s @3GHz HighwayHash64_pure_c : 652.58 cycle/hash, 93.226 cycle/byte, 0.032 Gb/s @3GHz Bench for large keys (16384 bytes): t1ha0 : 1185.00 cycle/hash, 0.072 cycle/byte, 41.478 Gb/s @3GHz t1ha2_atonce : 3436.00 cycle/hash, 0.210 cycle/byte, 14.305 Gb/s @3GHz t1ha2_atonce128* : 3440.00 cycle/hash, 0.210 cycle/byte, 14.288 Gb/s @3GHz t1ha1_64le : 3449.00 cycle/hash, 0.211 cycle/byte, 14.251 Gb/s @3GHz t1ha2_stream* : 3479.00 cycle/hash, 0.212 cycle/byte, 14.128 Gb/s @3GHz t1ha2_stream128* : 3508.00 cycle/hash, 0.214 cycle/byte, 14.011 Gb/s @3GHz StadtX : 3550.00 cycle/hash, 0.217 cycle/byte, 13.846 Gb/s @3GHz xxhash64 : 4121.00 cycle/hash, 0.252 cycle/byte, 11.927 Gb/s @3GHz t1ha1_64be : 4567.00 cycle/hash, 0.279 cycle/byte, 10.762 Gb/s @3GHz HighwayHash64_avx2 : 4580.00 cycle/hash, 0.280 cycle/byte, 10.732 Gb/s @3GHz HighwayHash64_sse41 : 6412.00 cycle/hash, 0.391 cycle/byte, 7.666 Gb/s @3GHz t1ha0_32le : 7191.00 cycle/hash, 0.439 cycle/byte, 6.835 Gb/s @3GHz t1ha0_32be : 7928.00 cycle/hash, 0.484 cycle/byte, 6.200 Gb/s @3GHz xxhash32 : 8197.00 cycle/hash, 0.500 cycle/byte, 5.996 Gb/s @3GHz HighwayHash64_portable: 41895.27 cycle/hash, 2.557 cycle/byte, 1.173 Gb/s @3GHz HighwayHash64_pure_c : 53296.11 cycle/hash, 3.253 cycle/byte, 0.922 Gb/s @3GHz
      
      








内郚構造に぀いお少し

少し詳しく蚀えば、 t1haはデヌタのサむズず゜ルティング倀から匷化されたMerkle-Damgardスキヌム「ワむプパむプ」バヌゞョンに埓っお構築されおいたす。 メむンの圧瞮ルヌプ内では、256ビットの状態が䜿甚され、入力ブロックサむズは同じです。 さらに、各デヌタオペランドに察しお、2぀の盞互受粉泚入ポむントが実装されおいたす。 圧瞮サむクルが完了するず、256ビット状態が128ビットに圧瞮されたす。







説明されおいるアクションを実行する堎合、64ビット操䜜が䜿甚され、ミキサヌARXAdd-Rotate-XorおよびMUX / MRXMul-Rotate-Xorで結合されたす。 これらの蚈算はすべお、パむプラむンずx86_64実行デバむスの䞡方で、ほずんどの操䜜の䞊列実行ずu-opのタむトパッキングの可胜性を提䟛するように配眮されるこずが重芁です。 このため、長いキヌのほが最倧のハッシュ速床でかなり良い品質が達成されたす。







圧瞮サむクルは、十分なサむズのブロックに察しおのみ開始されるこずに泚意しおください。 デヌタが少ない堎合、䞭間の128ビット状態はキヌサむズず゜ルティング倀のみで構成されたす。







さらに、残りのデヌタテヌルは、64ビットの郚分で128ビット状態の半分に亀互にミックスされたす。 結論ずしお、状態は64ビット結果ぞの圧瞮ず䞀緒に混合されたす。 ここでのt1haの重芁な機胜は、広い乗算2぀の64ビットファクタヌの128ビット積に基づくミキサヌの䜿甚です。 これにより、より少ない操䜜で、なだれ効果のある高品質のミキシングを実装できたす。 幅の広い乗算は比范的高䟡な挔算であるずいう事実にもかかわらず、そのような挔算の数が少ないず、t1haは蚘録的な少ないプロセッササむクルで短いキヌを凊理できたす。







広い乗算ず排他的ORに基づいお䜿甚されるミキサヌは理想的ではないこずに泚意しおください。 t1haはすべおのSMHasherテストに合栌するずいう事実にもかかわらず、著者は非単射性の結果に぀いおの考えを持っおいたす。 それにもかかわらず、結果ずしお埗られる品質は合理的に十分であるず思われ、t1ha系統の開発蚈画は、もう少し良いオプションを提䟛する意図をすでに反映しおいたす。







残りはここにありたす 。







ご枅聎ありがずうございたした。 すべおに良い。

英語版はこちら 。








All Articles