Я ищу способ шифрования/обфускации целочисленного идентификатора в другое целое число. Точнее, мне нужна функция int F(int x)
, так что
- x ↔ F (x) является взаимно однозначным соответствием (если x!= y, F (x)!= F (y))
- учитывая F (x), легко найти x - так что F не является хэш-функцией
- если x и F (x) трудно/невозможно обнаружить F (y), что-то вроде
x ^ 0x1234
не будет работать
Для ясности я не ищу сильное решение для шифрования, это только обфускация. Представьте себе веб-приложение с такими URL-адресами, как example.com/profile/1
, example.com/profile/2
и т.д. Профили сами по себе не секретны, но я бы хотел, чтобы случайные вуайеристы просматривали/извлекали все профили один за другим, поэтому я лучше их спрячу что-то вроде example.com/profile/23423
, example.com/profile/80980234
и т.д. Хотя маркеры, хранящиеся в базе данных, могут выполнять работу довольно легко, мне любопытно, есть ли для этого простая математика.
Одним из важных требований, о которых я не знал, является то, что результаты должны выглядеть "случайными", то есть заданными последовательностью x,x+1,...,x+n
, F(x),F(x+1)...F(x+n)
не должны образовывать прогрессию любого рода.