[解決済み] .NETでの2つのバイト配列の比較
2022-02-04 14:22:36
質問
どうすれば早くできるのですか?
もちろん、できますよ。
static bool ByteArrayCompare(byte[] a1, byte[] a2)
{
if (a1.Length != a2.Length)
return false;
for (int i=0; i<a1.Length; i++)
if (a1[i]!=a2[i])
return false;
return true;
}
しかし、私が探しているのは、どちらかの BCL 関数や、高度に最適化された実績のある方法でこれを行うことができます。
java.util.Arrays.equals((sbyte[])(Array)a1, (sbyte[])(Array)a2);
はうまく動くのですが、x64ではうまくいかないようです。
私の超高速回答をご覧ください こちら .
解決方法は?
ユーザー名 ギル が安全でないコードを提案し、この解決策が生まれました。
// Copyright (c) 2008-2013 Hafthor Stefansson
// Distributed under the MIT/X11 software license
// Ref: http://www.opensource.org/licenses/mit-license.php.
static unsafe bool UnsafeCompare(byte[] a1, byte[] a2) {
if(a1==a2) return true;
if(a1==null || a2==null || a1.Length!=a2.Length)
return false;
fixed (byte* p1=a1, p2=a2) {
byte* x1=p1, x2=p2;
int l = a1.Length;
for (int i=0; i < l/8; i++, x1+=8, x2+=8)
if (*((long*)x1) != *((long*)x2)) return false;
if ((l & 4)!=0) { if (*((int*)x1)!=*((int*)x2)) return false; x1+=4; x2+=4; }
if ((l & 2)!=0) { if (*((short*)x1)!=*((short*)x2)) return false; x1+=2; x2+=2; }
if ((l & 1)!=0) if (*((byte*)x1) != *((byte*)x2)) return false;
return true;
}
}
これは、配列の可能な限り多くの部分で 64 ビットベースの比較を行います。これは、配列がqwordアライメントで開始されるという事実を当てにしているようなものです。qwordアライメントでなくても動作しますが、qwordアライメントである場合ほど高速ではありません。
単純な
for
ループを使用します。J#ライブラリを使用すると、オリジナルの
for
のループになります。.SequenceEqualを使うと、IEnumerator.MoveNextを使っているためか、7倍ほど遅くなる。LINQベースのソリューションは、少なくともこれより遅いか、もっと悪いと想像しています。
関連
-
[解決済み】C#でクエスチョンマークを2つ並べるとどんな意味になるのか?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】WSACancelBlockingCallの例外について
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 配列の結合/平坦化
-
[解決済み] JavaScriptで2つの配列の差を取得する方法は?
-
[解決済み] UTF-8 byte[]を文字列に変換する方法
-
[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】「namespace」なのに「type」のように使われる。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み] C#のインターフェイス。暗黙の実装と明示の実装
-
[解決済み] C#でパスワードのハッシュ化とソルト化