0

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

4

3 に答える 3

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それが非常に巧妙で汚いことをしたので、それでももっと速いとしても私は驚かないでしょう。

于 2012-03-14T08:41:42.637 に答える
2

std::equal最善の策のように見えますが、機能しmemcmpます。効率に関しては、実装に依存しますが、(おそらく)データがどのように定義および表現されるかにも依存します。

于 2012-03-14T08:41:19.270 に答える
2

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

于 2012-03-14T08:33:59.403 に答える