Изменение порядка номеров - PullRequest
4 голосов
/ 12 декабря 2010

У меня есть номера в диапазоне 1-62 Я хочу иметь возможность "зашифровать" их, так что трудно догадаться, что они генерируются в каком-то порядке.

Итак, это должно быть какое-то отображение, например

1-> 35 2-> 19 3-> 61 ...

так что у меня есть 1 к 1, 100% обратим.


Я могу жестко отобразить код, но я бы предпочел математическое решение этому, некоторую формулу, которая принимает число в качестве аргумента и производит число в диапазоне 1-62 и НЕ генерирует дубликаты. Есть ли вероятность, что эта формула существует?


Только для истории, скрипт проверки:

<?
  $test = array();

  $val = 37;
  for($i=0;$i<62;$i++)
  {
    if($test[($i*$val)%62])
    {
      print("Collision: $i ".$test[($i*$val)%62]."<br/>");
    }
    $test[($i*$val)%62] = $i;
    print("$i => ".(($i*$val)%62)."<br/>");
  }

?>

Обновление:

Вот идентификаторы, сгенерированные благодаря этим ответам:

qpOLHk
NMb84H
aI740D
x5urn0
UsROKn
hPeb7K
EcByu7
1zYVRu
oWlieR
LjIFBe
8G52YB
v3splY
SqPMIl
fNc95I
Cazws5
ZxWTPs
mUjgcP
JhGDzc
6E30Wz

Sweeeeeet: -)

Ответы [ 4 ]

3 голосов
/ 12 декабря 2010

Вы можете поместить числа от 1 до 62 в массив и перемешать массив (например, используя перемешивание Фишера-Йейтса ).Индекс массива затем сопоставляется с содержимым этой ячейки (но будьте осторожны с ошибкой off-by-one, если вы используете 0-индексированные массивы).

Чтобы сделать его детерминированным, используйте конкретное начальное число длягенератор случайных чисел.

Редактировать: менее затратное в вычислительном отношении (и также более простое угадывание) отображение состоит в умножении на некоторую константу и затем вычислении результата по модулю 62:

result = (input * 37) % 62

Число37 это просто пример.Вы можете использовать любое число, которое является взаимно простым до 62 - это любое нечетное число, кроме 31.

1 голос
/ 12 декабря 2010

Взгляните на этот комментарий на странице str_rot13() руководства .

1 голос
/ 12 декабря 2010

В соответствии с комментариями Марка Байерса.Найдите обратное значение x mod n (например, n = 62).

Пусть x будет вашим целым числом ввода в интервале [1, n].Используйте расширенный евклидов алгоритм , чтобы найти y и t такие, что xy + nt = 1 mod n.Тогда y = x^{-1} mod n.

0 голосов
/ 12 декабря 2010

Использование RSA . Это довольно легко реализовать (в зависимости от языка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...