2012-03-14 15 views
0

私は2つのsha1ハッシュを比較したいと思います。これを行う最も効率的な方法は何でしょうか?現在、私はmemcmpを使用しようとしています。ありがとう。sha1ハッシュを等価で比較する最良の方法

+3

実際の質問は、次のようにする必要があります。実際のソリューションよりも速いものが本当に必要ですか?私はSHA1を比較することがアプリケーションのボトルネックであるとは思わない。 –

+0

@FerdinandBeyer優れた点 – fredoverflow

+0

私はフェルディナンドと全く同意していません。あなたがしようとしていることは、早すぎる最適化と呼ばれています... – Malkocoglu

答えて

3

さて、あなたはすでにブロックがどのように大規模なコンパイル時に知っているので、あなたはこれを行うことができます:

#include <cstdint> 

bool is_same_sha1(const char* p, const char* q) 
{ 
    const std::uint32_t* a = (const std::uint32_t*)p; 
    const std::uint32_t* b = (const std::uint32_t*)q; 
    return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] 
     && a[3] == b[3] && a[4] == b[4]; 
} 

しかし、やみくもに私のアドバイスを取ることはありません、あなたは対策はに対して任意のカスタムソリューションべきmemcmpソリューションを使用して、パフォーマンスが大幅に向上する場合にのみ使用してください。私はmemcmpが非常に巧妙で汚れた何かをしたので、まだ高速だった場合でも驚くことはありません。

+0

これは良い解決策のようです。 memcmpよりも速いです。ありがとう。 std :: equalが何らかの違いをもたらすかどうかを確認する必要があります。 – polapts

+0

バッファが正しく配置されていないと、これが失敗することがあります。(これは正式には未定義の動作ですが、アライメントなどの外部制約が満たされていることが意図されていることは明らかですが、そうでない場合は非常に実装が貧弱です) –

+0

もちろん、 uint32_t'が利用できない可能性があります。 (最終的には、あなたの移植性の制約に依存します.'Uint32_t'はWindowsとPosix準拠のシステムで利用可能です。十分に移植可能なアプリケーションがたくさんあります) –

2

memcmp()の何か問題がありますか?両方のハッシュのすべてのバイトを比較する必要があります。 memcmp()は最初に見つかった差異にすぐに失敗します。 memcmp()は、ライブラリの作成者がプラットフォームに適したチャンクサイズで作業するように記述することができます。

+0

私は 'std :: equal'が' memcpy'より速いと期待します。コンパイラは関係する正確な型のためにコンパイラを生成し、場合によっては整列などのことも考慮に入れることができます。 (もちろん、 'memcpy'は' __builtin_memcpy'のようなものに対して '#define'のようなものかもしれませんので、コンパイラは同様の最適化を行うことができます)。 –

+0

真実ですが、境界線を揃えるのは間違いありません。もしそれらが32バイトブロックに整列していれば、それらをチェックする単一のSSE-something命令かもしれません... – sarnold

+0

@sarnold正確に160ビットを比較するSSE命令がありますか? :)あなたは恐らくメモリから(過度に)危険にさらさなければならないでしょうし、余分なビットをマスクしなければならないでしょう。 – fredoverflow

2

std::equalのようになりますが、memcmpでも動作します。 効率に関しては、実装に依存しますが、 (場合によっては)どのようにデータが定義され表現されるかについても考えられます。

関連する問題