Симметричный биективный алгоритм для целых чисел - PullRequest
32 голосов
/ 28 июня 2010

Мне нужен алгоритм, который может выполнять взаимно-однозначное сопоставление (т. Е. Без коллизий) 32-разрядного целого числа со знаком и другого 32-разрядного целого числа со знаком.

Моя настоящая проблема - достаточно энтропиитак что вывод функции выглядит случайным.В основном я ищу шифр, похожий на XOR Cipher, но который может генерировать более произвольно выглядящие результаты.Безопасность - не моя настоящая проблема, хотя неизвестность - это.

Редактировать для уточнения:

  1. Алгоритм должен быть симметричным, чтобы я мог полностью изменить операциюбез пары ключей.
  2. Алгоритм должен быть биективным, каждое 32-битное входное число должно генерировать 32-битное уникальное число.
  3. Вывод функции должен бытьКак ни странно, добавление только одного к входу должно сильно повлиять на вывод.

Пример ожидаемого результата:F (100) = 98456F (101) = -758F (102) = 10875498F (103) = 986541F (104) = 945451245F (105) = -488554

Так же, как MD5, изменение одной вещи может многое изменить.

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

Ответы [ 11 ]

0 голосов
/ 28 июня 2010

Нарисуйте большой круг на большом листе бумаги.Запишите все целые числа от 0 до MAXINT по часовой стрелке от вершины круга, с равным интервалом.Запишите все целые числа от 0 до MININT против часовой стрелки, снова с одинаковым интервалом.Обратите внимание, что MININT находится рядом с MAXINT в нижней части круга.Теперь сделайте дубликат этой фигуры на обеих сторонах части жесткой карты.Прикрепите жесткую карту к кругу через центры обоих.Выберите угол поворота, любой угол, который вам нравится.Теперь у вас есть отображение 1-1, которое удовлетворяет некоторым вашим требованиям, но, вероятно, недостаточно ясно.Открепите карту, переверните ее по диаметру, любому диаметру.Повторяйте эти шаги (в любом порядке) до тех пор, пока у вас не получится биекция, которой вы довольны.

Если вы внимательно следите за этим, то не составит труда запрограммировать его на предпочитаемом вами языке.

Для уточнения после комментария: Если вы поворачиваете карточку только против бумаги, то метод такой же простой, как вы жалуетесь.Однако, когда вы переворачиваете карту поверх сопоставления, это не эквивалентно (x+m) mod MAXINT для любого m.Например, если вы оставите карту не повернутой и перевернете ее по диаметру через 0 (который находится на верхней части циферблата), тогда 1 отобразится на -1, от 2 до -2 и так далее.(x+m) mod MAXINT соответствует только поворотам карты.

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