Идеальный хэш, скорее всего, неосуществим, потому что может потребоваться много времени на вычисление, чтобы найти его для вашего набора данных.
Будет ли bool[][][]
работать для вас, где true
означает, что определенная комбинация x, y, z была обработана? Ниже представлен прототип для трехмерного битового массива. Из-за ограничений Int32, это будет работать только до максимального индекса около 1024 (но будет в пределах 128 МБ). Вы можете получить до 10000, создав BitArray [] []. Тем не менее, это, вероятно, не практично при таком размере, поскольку он занимал бы более 116 ГБ ОЗУ.
В зависимости от вашего точного размера проблемы и потребностей, лучшим вариантом может быть простая старая хеш-таблица (с коллизиями). Тем не менее, вот код прототипа:
public class ThreeDimensionalBitArray
{
// todo: consider making the size configurable
private const int MAX_INDEX = 1000;
private BitArray _bits = new BitArray(MAX_INDEX * MAX_INDEX * MAX_INDEX);
public bool this[int x, int y, int z]
{
get { return _bits[getBitIndex(x, y, z)]; }
set { _bits[getBitIndex(x, y, z)] = value; }
}
public ThreeDimensionalBitArray()
{
}
private static int getBitIndex(int x, int y, int z)
{
// todo: bounds check x, y, and z
return (x * MAX_INDEX * MAX_INDEX) + (y * MAX_INDEX) + z;
}
}
public class BitArrayExample
{
public static void Main()
{
ThreeDimensionalBitArray bitArray = new ThreeDimensionalBitArray();
Console.WriteLine(bitArray[500, 600, 700]); // "false"
bitArray[500, 600, 700] = true;
Console.WriteLine(bitArray[500, 600, 700]); // "true"
}
}