Хорошие хеш-функции - это односторонние функции, которые позволяют вам создавать распределенное значение из любого заданного входа. Следовательно, вы получите несколько уникальных значений для каждого входного значения. Они также повторяемы, так что любой вход всегда будет генерировать один и тот же вывод.
Примером хорошей хеш-функции является SHA1 или SHA256.
Допустим, у вас есть таблица базы данных пользователей. Столбцы id
, last_name
, first_name
, telephone_number
и address
.
Хотя в любом из этих столбцов могут быть дубликаты, давайте предположим, что ни одна строка не является точно такой же.
В этом случае id
- это просто уникальный первичный ключ нашего создания (суррогатный ключ). Поле id на самом деле не содержит никаких пользовательских данных, потому что мы не смогли найти естественный ключ, который был бы уникальным для пользователей, но мы используем поле id для построения отношений внешнего ключа с другими таблицами.
Мы могли бы посмотреть запись пользователя в нашей базе данных следующим образом:
SELECT * FROM users
WHERE last_name = 'Adams'
AND first_name = 'Marcus'
AND address = '1234 Main St'
AND telephone_number = '555-1212';
Чтобы найти мою запись, нам нужно поискать в 4 разных столбцах, используя 4 разных индекса.
Однако вы можете создать новый столбец «хэш» и сохранить значение хеш-функции всех четырех столбцов вместе.
String myHash = myHashFunction("Marcus" + "Adams" + "1234 Main St" + "555-1212");
Вы можете получить хеш-значение, например AE32ABC31234CAD984EA8
.
Вы сохраняете это хеш-значение в виде столбца в базе данных и индексируете его. Теперь вам нужно искать только один индекс.
SELECT * FROM users
WHERE hash_value = 'AE32ABC31234CAD984EA8';
Получив идентификатор запрашиваемого пользователя, мы можем использовать это значение для поиска связанных данных в других таблицах.
Идея состоит в том, что хэш-функция выгружается с сервера базы данных.
Столкновения маловероятны. Если два пользователя имеют одинаковый хэш, скорее всего, они имеют дублирующиеся данные.