私は2つのsha1ハッシュを比較したいと思います。これを行う最も効率的な方法は何でしょうか?現在、私はmemcmpを使用しようとしています。ありがとう。sha1ハッシュを等価で比較する最良の方法
答えて
さて、あなたはすでにブロックがどのように大規模なコンパイル時に知っているので、あなたはこれを行うことができます:
#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
が非常に巧妙で汚れた何かをしたので、まだ高速だった場合でも驚くことはありません。
これは良い解決策のようです。 memcmpよりも速いです。ありがとう。 std :: equalが何らかの違いをもたらすかどうかを確認する必要があります。 – polapts
バッファが正しく配置されていないと、これが失敗することがあります。(これは正式には未定義の動作ですが、アライメントなどの外部制約が満たされていることが意図されていることは明らかですが、そうでない場合は非常に実装が貧弱です) –
もちろん、 uint32_t'が利用できない可能性があります。 (最終的には、あなたの移植性の制約に依存します.'Uint32_t'はWindowsとPosix準拠のシステムで利用可能です。十分に移植可能なアプリケーションがたくさんあります) –
memcmp()
の何か問題がありますか?両方のハッシュのすべてのバイトを比較する必要があります。 memcmp()
は最初に見つかった差異にすぐに失敗します。 memcmp()
は、ライブラリの作成者がプラットフォームに適したチャンクサイズで作業するように記述することができます。
私は 'std :: equal'が' memcpy'より速いと期待します。コンパイラは関係する正確な型のためにコンパイラを生成し、場合によっては整列などのことも考慮に入れることができます。 (もちろん、 'memcpy'は' __builtin_memcpy'のようなものに対して '#define'のようなものかもしれませんので、コンパイラは同様の最適化を行うことができます)。 –
真実ですが、境界線を揃えるのは間違いありません。もしそれらが32バイトブロックに整列していれば、それらをチェックする単一のSSE-something命令かもしれません... – sarnold
@sarnold正確に160ビットを比較するSSE命令がありますか? :)あなたは恐らくメモリから(過度に)危険にさらさなければならないでしょうし、余分なビットをマスクしなければならないでしょう。 – fredoverflow
std::equal
のようになりますが、memcmp
でも動作します。 効率に関しては、実装に依存しますが、 (場合によっては)どのようにデータが定義され表現されるかについても考えられます。
- 1. スキームリスト等価比較
- 2. 多次元配列を等価で比較する方法は?
- 3. C++の等価(==)オーバーロード、すべての属性を比較するショートカットまたは最良の方法
- 4. SHA1ハッシュをwordpressアカウントのログインに比較すると
- 5. fsharpのカスタム比較と等価性
- 6. WPFコンボボックスのカスタム等価比較者
- 7. 2つのURLを比較する最良の方法
- 8. 2つのxドキュメントを等価で比較する
- 9. Smalltalk - 2つの文字列を等価で比較する
- 10. std :: stringsを比較する最良の方法
- 11. LocalDatesを比較する最良の方法
- 12. ハッシュされた文字列を比較する最良の方法は何ですか? (PHP)
- 13. 注文とコレクションの等価性を比較する
- 14. Octave/MATLAB:構造体の等価性を比較するには?
- 15. shared_ptrオブジェクトの等価性を比較する
- 16. EntityTag - 価値、キャッシング、比較 - ジャージーの方法
- 17. 2つのエンティティフレームワークエンティティを比較する最良の方法は何ですか?
- 18. Javascriptでの等価性のNaN値の比較
- 19. jQueryでDivの価値を比較する方法
- 20. pthread_tとint入力の等価性を比較しますか?
- 21. Crystal Reportsを比較する最良の方法は何ですか?
- 22. Javaでコンパレータの比較メソッドを実装する最良の方法は?
- 23. リモートサーバー間でファイルを比較する最も良い方法は何ですか?
- 24. C#の2つのDateTimeの等価性を比較する最良の方法はありますが、特定の精度にしか達しません。
- 25. Matlabの2つの信号を比較する最良の方法
- 26. 2つの列挙型*の等価性の比較?
- 27. SQLサーバーの日付と日時の等価性の比較
- 28. 2 xsdスキーマファイルと同等の機能を比較する方法
- 29. 2つのnumpy配列を等価の要素で比較する
- 30. uint32_t型のC++の等価性が比較されない
実際の質問は、次のようにする必要があります。実際のソリューションよりも速いものが本当に必要ですか?私はSHA1を比較することがアプリケーションのボトルネックであるとは思わない。 –
@FerdinandBeyer優れた点 – fredoverflow
私はフェルディナンドと全く同意していません。あなたがしようとしていることは、早すぎる最適化と呼ばれています... – Malkocoglu