Ваш алгоритм (из исходного вопроса, где вы заявили, что генерируете ключ 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.
Но, если вы не выберете одно из этих ограничений, нет никакого способа гарантировать, что не будет столкновения клавиш.