.net – 什么内存基数,列表,B树或其他布局适用于IPv6阻止列表? (uint128)?

我需要为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来验证每个帐户,所以一个简单的列表就足够了.

点赞