グラフ エッジを表すために、C# で次の構造を使用しています。
struct Edge
{
public Edge(int leftA, int leftB, int leftC, int leftD, int rightA, int rightB, int rightC, int rightD)
{
LeftIdA = leftA;
LeftIdB = leftB;
LeftIdC = leftC;
LeftIdD = leftD;
RightIdA = rightA;
RightIdB = rightB;
RightIdC = rightC;
RightIdD = rightD;
}
public readonly int LeftIdA;
public readonly int LeftIdB;
public readonly int LeftIdC;
public readonly int LeftIdD;
public readonly int RightIdA;
public readonly int RightIdB;
public readonly int RightIdC;
public readonly int RightIdD;
}
そして、重複がないように、HashSet に大量 (約 500 万個) を格納する必要があります。速度を最適化するための GetHashCode の適切な実装は何でしょうか?
次のように、返された整数に各 ID の 4 ビットを格納しようとしました。
public override int GetHashCode()
{
int A = LeftIdA & 0xF;
int B = LeftIdB & 0xF;
int C = LeftIdC & 0xF;
int D = LeftIdD & 0xF;
int E = RightIdA & 0xF;
int F = RightIdB & 0xF;
int G = RightIdC & 0xF;
int H = RightIdD & 0xF;
int result = A;
result = (result << 4) | B;
result = (result << 4) | C;
result = (result << 4) | D;
result = (result << 4) | E;
result = (result << 4) | F;
result = (result << 4) | G;
result = (result << 4) | H;
return result;
}
リストに項目を追加するよりも 80% 遅くなります。