Псевдослучайные числа из 32-битного автоинкремента INTEGER - PullRequest
3 голосов
/ 13 июня 2011

У меня есть таблица с 32-разрядным целочисленным первичным ключом с автоинкрементом в базе данных, которая будет выдавать числа в диапазоне 1-4294967295.

Я бы хотел сохранить удобство автоматически сгенерированного первичного ключа, в то время как мои номера на внешнем интерфейсе приложения выглядят как случайно сгенерированные.

Существует ли математическая функция, которая допускала бы двустороннее преобразование один в один между целым числом и другим?

Например, функция будет принимать число и переводить его в другое:

1 => 1538645623
2 => 2043145593
3 =>  393439399

И еще одна функция обратного пути:

1538645623 => 1
2043145593 => 2
 393439399 => 3

Я не обязательно ищу здесь реализацию, а скорее намек на то, что, я полагаю, должно быть известной математической проблемой где-то:)

Ответы [ 3 ]

6 голосов
/ 13 июня 2011

Математически это почти та же проблема, что и криптография.

Вы: Я хочу перейти от идентификатора (строка битов) к другому числу (строка битов) и обратно обратно неочевидным способом.Криптография: я хочу перейти от простого текста (строки битов) к другой строке битов и обратно (обратимо) неочевидным способом.

Итак, для простого решения могу ли я предложить просто подключить что-нибудьАлгоритм шифрования наиболее удобен на вашем языке, а зашифровывать и дешифровать ваш идентификатор?

Если вы хотите быть немного умнее, вы можете сделать то, что называется "засолкой", в дополнение к криптографии.Возьмите свой идентификатор в качестве 32-битного (или любого другого) числа.Объедините его со случайным 32-битным числом.Зашифруйте результат.Чтобы развернуть, просто расшифровать и выбросить случайную часть.

Конечно, если кто-то серьезно атаковал это, это может быть уязвимо для известных атак открытого / дифференциального криптоанализа, так как у вас очень мало известного открытого текста,но похоже, что вы не пытаетесь защищаться от серьезных атак.

2 голосов
/ 13 июня 2011

Сначала удалите смещение 1, чтобы получить числа в диапазоне от 0 до 2 32 -2.Пусть m = 2 32 -1.

Выберите a, относительное простое число к m.Поскольку оно относительно простое, оно имеет обратное значение a ', так что a * a' = 1 (mod m).Также выберите b.Выбирайте большие числа, чтобы получить хороший эффект микширования.

Затем вы можете вычислить желаемое псевдослучайное число по y = (a * x + b) % m и получить обратно оригинал по x = ((y - b) * a') % m.

один шаг линейного конгруэнтного генератора (LCG) для псевдослучайных чисел.

Обратите внимание, что это небезопасно, это только запутывание.Например, если пользователь может получить два числа в последовательности, он может легко восстановить a и b.

0 голосов
/ 13 июня 2011

В большинстве случаев веб-приложения используют хэш случайно сгенерированного числа в качестве ссылки на строку таблицы.Этот хэш может быть сохранен как число и отображен как строка для конечного пользователя.

Этот хеш является уникальным и является идентификатором, а идентификатор используется только в самом приложении и никогда не показывается внешнему миру.

...