Функция целых сопоставлений в одну к одному

Мы используем MySQL и разработав приложение, где мы хотели бы, чтобы последовательность идентификатора не была общедоступна ... IDS вряд ли в секрете, и нет существенной проблемы, если кто-то действительно был в состоянии декодировать их.

Итак, хеш, конечно, очевидное решение, в настоящее время мы используем MD5 ... 32-битные целые числа входят в целые числа MD5, и мы обрежьте MD5 до 64битов, а затем храните это. Тем не менее, мы понятия не имеем представления, насколько вероятными столкновениями являются, когда вы обрезаете так (тем более, что все номера происходят от автоматики или текущего времени). В настоящее время мы проверяем столкновения, но, поскольку мы можем вставлять 100 000 строк одновременно, когда производительность ужасна (не может вставить вставку).

Но в итоге нам действительно не нужна безопасность, предлагаемая хэшими, и они потребляют ненужное пространство, а также требуют дополнительного индекса ... Итак, есть ли простая и достаточно хорошая функция / алгоритм, что гарантии Однозначное отображение для любого числа без очевидных визуальных шаблонов для последовательных чисел?

Редактирование: Я использую PHP, который не поддерживает целочисленное арифметика по умолчанию, но после того, как оглядывался вокруг, я обнаружил, что его можно дешево реплицироваться операторы. Код для 32-битного целочисленного умножения можно найти здесь: http://pastebin.com/np28xhqf

10
задан Andreas 2 September 2011 в 22:49
поделиться