我需要为IPv6创建白名单/阻止列表.
有哪些内存选项可用于在IPv6中按主机或按网络维护信息?
我目前使用的是HashTable< UInt32>对于IPv4,但从未真正掌握子网跟踪,CIDR等.IPv6有许多不同的表达IP范围的方法,使我将IP组合在一起的工作复杂化,并考虑到它们.
那就是说.拥有这样的阻止列表/白名单的最有效方式(在搜索速度或内存紧凑性方面)是什么?
TL; DR问题
>如何查找UInt128是否在list / btree / hashtable中?哪种数据结构适合这个?
>如何找到彼此“接近”的IP.这通常称为CIDR,但我们也可以将其表示为BigInt的值比较.
刚出现在我脑海中的一种方法是加密累加器如何工作.也许有一种方法可以利用累加器的“成员资格”能力来确定一个数字是否是一个集合的成员
最佳答案 我在std :: pair< in6_addr,uint8_t>中存储用于白名单的IPv6地址.这是一对网络和CIDR位.
检查白名单时,我只是迭代关联的网络,并进行CIDR匹配:
bool cidr6_match(const in6_addr &address, const in6_addr &network, uint8_t bits) {
#ifdef LINUX
const uint32_t *a = address.s6_addr32;
const uint32_t *n = network.s6_addr32;
#else
const uint32_t *a = address.__u6_addr.__u6_addr32;
const uint32_t *n = network.__u6_addr.__u6_addr32;
#endif
int bits_whole, bits_incomplete;
bits_whole = bits >> 5; // number of whole u32
bits_incomplete = bits & 0x1F; // number of bits in incomplete u32
if (bits_whole) {
if (memcmp(a, n, bits_whole << 2)) {
return false;
}
}
if (bits_incomplete) {
uint32_t mask = htonl((0xFFFFFFFFu) << (32 - bits_incomplete));
if ((a[bits_whole] ^ n[bits_whole]) & mask) {
return false;
}
}
return true;
}
改编自xfrm的addr_match.
有关与CIDR匹配的更多信息:IP cidr match function
我很高兴听到其他人可以提出的更奇特的数据类型.对于我自己的用例,我有大量的IP来验证每个帐户,所以一个简单的列表就足够了.