генерация уникальных ключей - PullRequest
0 голосов
/ 21 июня 2011

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

Отредактировано: извините, ребята, я изменил Q, когда вы, ребята, отвечали на Q, я думал, что вышеупомянутый Q - лучший способ задать вопрос, мой Q находится в моем B-дереве, которое я хранюipaddress (src ip и dst ip) ipv4 я генерирую ключ для этого с использованием ip получателя, например: если у меня есть адрес 172.28.6.100, я генерирую ключ, используя последние два байта как 600 (6 * 100)теперь я должен хранить даже адрес ipv6, как я могу сгенерировать ключ для этого мне нужно сгенерировать уникальный ключ для каждого адреса.

Ответы [ 4 ]

3 голосов
/ 21 июня 2011
unsigned generate_key(int x) { return x; }

Всегда возвращает другой хэш для другого входа.Это идеальная идеальная хеш-функция .

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

Если пространство IP-адресов, с которым вы имеете дело, не ограничено (т.е. вы выбираете числа, а они являются частью частной сети, например, 10.xxx), использование последних двух октетов и их умножение будут иметь коллизии для разных IP-адресов всякий раз, когда в конечном ответе используется более одного множителя, который может создать один и тот же ключ, единственный способ, которым они не будут сталкиваться, - это если бы все использованные вами октеты были простыми числами (что не может быть).

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

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

Ваш алгоритм (из исходного вопроса, где вы заявили, что генерируете ключ c*d из IP-адреса a.b.c.d) даже не гарантирует уникальность для ваших IPv4 адресов.172.28.6.12 будет иметь идентичный ключ к 172.28.12.6 и 9.45.3.24 и 10.1.72.1 (среди прочих).

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

Мой вопрос: почему вы хэшируете.Вы можете поместить адрес IPv4 в четыре байта, а адрес Ipv6 - в шестнадцать байтов.Они не настолько велики, чтобы вы не могли использовать весь адрес в качестве ключа, не так ли?

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


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

Если вы хэшируете данные для генерации ключей, есть только два способа гарантировать уникальность ключей:

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

Первый из них очень мало вас покупает.Иногда полезно сопоставить разреженные данные с непрерывными индексами для эффективного поиска, но не сэкономит вам места.

Второй часто используется, когда вы знаете, что данные будут ограничены, например (1) все ваши IP-адреса начинаютсяс 10.1 или все они являются целыми числами от 1000 до 1099.

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

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

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

Список стандартных алгоритмов хеширования здесь .

после вашего редактирования

Для использования ключей в вашем BTree (изначально я читал это как лицензионные ключи, поэтому я упомянул перевод в ASCII) - нет причинчто бы не использовать IP-адрес назначения целиком в качестве ключа (будь то IPv4 или IPv6, самое большее - 128 бит, очень разумно).В противном случае вы не сможете обеспечить требуемую уникальность, если у вас нет каких-либо предположений или знаний о топографии сети.

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