Точно так же, как предложил «Знак высокой эффективности» (+1 с моей стороны) - действительно, это правильный подход. Вы должны сохранять отсортированные строки (чтобы 15 целых чисел были в столбцах в отсортированном порядке). Таким образом, сравнивая две строки, вы легко можете определить, идентичны они или нет (начинайте с любого конца и продолжайте, пока не найдете несоответствие - если все 15 чисел совпадают, значит, это совпадение).
Если вам просто нужна хеш-функция для индексации, то вам поможет и та же идея:
отсортировать 15 чисел подряд и создать хеш, равный:
Сумма для i = от 1 до 15 (a_i * k ^ i) // k - положительное целое число - см. Ниже
Это дает вам довольно приличный индекс. Если вы можете сохранить k как очень большое, это становится доказуемо свободным от столкновений, но размер индексированного значения увеличивается. Даже если k равно 2, он в значительной степени свободен от столкновений для 5 миллионов строк и 15 столбцов, предполагая, что целочисленный диапазон равен 2 ^ 16.
Другая идея - поскольку вы в основном рассматриваете эвристику, вы также можете рассмотреть более простой подход:
Оставьте еще 3 столбца для min, max и суммы 15 столбцов. Проверка, совпадают ли эти 3 для 2 строк, устранит БОЛЬШОЕ количество истинных негативов. Некоторые ложные срабатывания все равно останутся. (Нетрудно заметить, что использование k = 1 в приведенной выше схеме аналогично сохранению суммы столбцов в качестве значения индекса, которое является одним из 3 значений, упомянутых в этом решении.)
[Возможно, закрытый вопрос - гибкий ли дизайн вашей БД? Это не выглядит стабильным дизайном, так как столбцы, кажется, представляют дочерние объекты, но у меня нет деталей, чтобы сказать это окончательно.]