Мы используем MySQL и разрабатываем приложение, в котором мы хотели бы, чтобы последовательность идентификаторов не была общедоступной ... идентификаторы вряд ли являются совершенно секретными, и нет существенной проблемы, если кто-то действительно сможет их декодировать.
Итак, хеш - это, конечно, очевидное решение, мы в настоящее время используем целые числа MD5 ... 32-битные, и мы обрезаем MD5 до 64-бит и затем сохраняем его. Тем не менее, мы не знаем, насколько вероятны столкновения при подобной обрезке (особенно если учесть, что все числа взяты из автоинкремента или текущего времени). В настоящее время мы проверяем наличие коллизий, но поскольку мы можем вставлять 100 000 строк одновременно, производительность ужасна (невозможно массовое добавление).
Но, в конце концов, нам действительно не нужна безопасность, обеспечиваемая хешами, и они занимают ненужное пространство, а также требуют дополнительного индекса ... Итак, есть ли какая-нибудь простая и достаточно хорошая функция / алгоритм, которая гарантирует однозначное сопоставление для любого числа без очевидных визуальных шаблонов для последовательных чисел?
РЕДАКТИРОВАТЬ: я использую PHP, который не поддерживает целочисленную арифметику по умолчанию, но после осмотра я обнаружил, что это может быть дешево реплицировано с побитовыми операторами. Код для умножения 32-битного целого числа можно найти здесь: http://pastebin.com/np28xhQF