За MySql не скажу, могу сказать, что в MSSQL - это делается только через создание таблицы.
А не подскажете у IEqualityComparer нет никаких ограничений на работу в разных потоках или разных классах?
А вариант с преобразованием байтов в строку без проблем проходит из класса в класс, из потока в поток, через все наследования итп.
internal class Comparer : IEqualityComparer<byte[]>
{
#region - Interface Implementations -
public bool Equals(byte[]? x, byte[]? y)
{
if (x == null || y == null) return false;
if (x.Length != y.Length) return false;
for (var i = 0; i < x.Length; i++)
{
if (x[i] != y[i]) return false;
}
return true;
}
public int GetHashCode(byte[] obj)
{
if (obj == null || obj.Length == 0) return 0;
int hashcode = obj[0];
for (var i = 1; i < obj.Length; i++)
{
hashcode = HashCode.Combine(hashcode, obj[i]);
}
return hashcode;
}
#endregion
}
internal class Program
{
#region - Members -
private static void Main(string[] args)
{
var d = new Dictionary<byte[], string>(new Comparer());
byte[] buffer1 = new byte[5] { (byte)4, (byte)0, (byte)91, (byte)204, (byte)2 };
byte[] buffer2 = new byte[5] { (byte)4, (byte)0, (byte)91, (byte)204, (byte)2 };
d.Add(buffer2, "bla bla bla");
Console.WriteLine(d[buffer1]); //bla bla bla
Console.WriteLine(d[buffer2]); //bla bla bla
}
#endregion
}
internal class Comparer : IEqualityComparer<byte[]>
{
public bool Equals(byte[]? x, byte[]? y)
{
if (x == null || y == null) return false;
if (x.Length != y.Length) return false;
for (int i = 0; i < x.Length; i++)
{
if (x[i] != y[i]) return false;
}
return true;
}
public int GetHashCode(byte[] obj)
{
if (obj == null || obj.Length == 0) return 0;
int hashcode = obj[0];
for (var i = 1; i < obj.Length; i++)
{
hashcode = HashCode.Combine(hashcode, obj[i]);
}
return hashcode;
}
}
class Program
{
static void Main(string[] args)
{
var d = new Dictionary<byte[], int>(new Comparer());
byte[] b1 = {1, 2, 3, 4};
byte[] b2 = {1, 2, 3, 4};
d[b1] = 1;
d[b2] = 2;
Console.WriteLine(d.Count);
}
}