Алгоритм генерации уникальных ключей - PullRequest
2 голосов
/ 23 июня 2011

мне нужно генерировать уникальные значения, используя адреса ipv4 и ipv6, т.е. если я ввожу 192.37.4.60; должен быть сгенерирован уникальный ключ, а когда я введу 192.60.4.37, должен быть сгенерирован другой ключ. Как я могу это сделать, может кто-нибудь мне помочь, и я также могу ввести адрес ipv6, а также как генерировать уникальные значения для каждого входа. может ли любой из них предложить любой алгоритм или любой существующий алгоритм

Ответы [ 7 ]

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

Преобразование IP-адреса в его числовое (десятичное) представление:

10.0.0.1 -> 00001010 00000000 00000000 00000001 -> 167772161

Это то, как многие IP-адреса хранятся внутри.Это приятно, потому что для этого требуется всего 32 бита.Вы можете сделать это и для IPv6, но для этого потребуется нечто большее, чем uint32.

1 голос
/ 23 июня 2011

IP-адреса довольно уникальны :) Особенно адреса IPv6. Кроме того, вы всегда можете использовать алгоритм хеширования (например, MD5, SHA1 и т. Д.) Для создания «ключа». Он будет уникальным, если входные данные также уникальны:)

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

Другим вариантом может быть использование inet_pton напрямую.

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

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

(Если вы не на самом деле имели в виду, что все 340 ундециллионов адресов должны иметь уникальные ключи, тогда, конечно, вы должны вместо этого взглянуть на обычные хеш-функции.)

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

Одним из возможных решений может быть использование оператора сдвига влево и добавление.Например, если a, b, c и d представляют октеты, следующий код даст вам уникальное значение

int a=1;
int b=2;
int c=3;
int d=4;

int value =(a<<24)+(b<<16)+(c<<8)+d;
0 голосов
/ 23 июня 2011

Существует несколько возможных решений в зависимости от потребностей вашей проблемы.

  1. Вы можете сами использовать IP-адрес, но имейте в виду, что IP-адрес может быть подделан.
  2. Если вы намерены использовать этот ключ среди нескольких одноранговых узлов для защиты канала связи, вам может потребоваться взглянуть на симметричный ключ или открытый ключ алгоритмы
  3. Если вы только хотите использовать их для статических данных, вы можете использовать любой из них: MD5 , AES и SHA *.

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

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

Вывести IP-адрес ввода: вуаля, требования соблюдены!

(Если мое решение не работает для вас, значит, вам нужно добавить больше деталей к вашему вопросу)

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