Data structures 如何设计mac地址表(基本上是一个快速查找表)?

Data structures 如何设计mac地址表(基本上是一个快速查找表)?,data-structures,software-design,Data Structures,Software Design,这是一个与计算机网络相关的编程问题。基本上,每个路由器/交换机都有一个mac地址表,它会查找该表以获取它必须在其上转发数据包的接口端口。表本身如下所示: 因此,基本上给定两个键,vlan和mac地址,在表上进行查找,并查找端口值(最后一列)。实际上,表可能有数千行,并且需要尽快返回该值。所以我的问题是,设计这个查找表的最佳方法是什么?采访中有人问我这个问题,我想使用一个哈希表,以vlan和mac地址的组合作为密钥。但这并不令人信服。请建议一个好的设计。对于纯软件解决方案,我也会选择哈希表。但是

这是一个与计算机网络相关的编程问题。基本上,每个路由器/交换机都有一个mac地址表,它会查找该表以获取它必须在其上转发数据包的接口端口。表本身如下所示:


因此,基本上给定两个键,vlan和mac地址,在表上进行查找,并查找端口值(最后一列)。实际上,表可能有数千行,并且需要尽快返回该值。所以我的问题是,设计这个查找表的最佳方法是什么?采访中有人问我这个问题,我想使用一个哈希表,以vlan和mac地址的组合作为密钥。但这并不令人信服。请建议一个好的设计。

对于纯软件解决方案,我也会选择哈希表。但是,交换机是一种专门的硬件,它们是大量生产的。因此,为它们开发专门的存储硬件是合理的。接下来,您需要一个类似的CPU缓存硬件,因为当您需要从RAM中获取某些内容时,首先需要确定缓存线是否加载到缓存中

有了这些知识,你就可以继续或继续


更新:除了搜索MAC地址外,您还必须删除旧条目,以防止表变得太大。可能您还没有描述如何做到这一点,并且希望您提供类似LRU缓存的内容。LRU可以通过哈希表实现,只需添加额外的链表来删除队列。或者代替LRU,您可以使用复杂的冲突解决策略创建一个哈希表:拥有固定数量的bucket,并限制bucket的大小。如果桶满了,就从它上面掉点东西。< /p> < p>你可以去一个哈希表(< C++ >代码> java > 这里的一个关键部分是拥有一个适当的哈希函数,例如,您可以使用vlan和mac地址的组合,在
O(1)


或者,我认为,如果条目的数量真的很大,trie数据结构将有助于减少内存占用。

同样值得注意的是,使用暴力的数组/列表可能会惊人地快——“数千项”根本不多

在类似的主题中,排序数组/列表也可以工作,允许二进制搜索


请记住,如果n有限制,则所有数据结构都是O(1)。

是,但表本身是动态的。它不断变化,即条目随时可能被删除/修改。因此,我认为,一直保持它的有序性本身就是一个挑战。@user2311285这完全有可能,问题是它是否重要。一个交换机/路由器只需要担心几个MAC地址,它们应该很少被添加和删除。即使对于一个小小的处理器来说,对这样一个小的列表进行排序也是微不足道的。对于我的局域网,我估计大约有10台设备,每天添加和删除的设备数量不超过10台。查找每天发生数百万到数千万次,而不是几个MAC地址。您没有很多设备,但可以安装上千台设备。一个好的交换机可以同时处理第十个千兆(或10G)连接。因此,它可以是每秒数百万或千万次的查找。对每个数据包在整个表上进行迭代将花费太多的时间@AlexeyGuseynov 1)不同的细分市场将做出不同的权衡。2) 不要将一个网络与数千个带有单个交换机的设备混淆。3) 在您坐下来对比较进行实际基准测试之前,任何性能评论都是纯粹的推测。1)是的。而且低端也不有趣,因为没有性能问题。2) 交换机服务于整个网络。您可以将它们堆叠到5个级别,并为整个网络进行路由。3) 正如我在回答中所说的,这是一个经典的问题,所以所有需要的基准测试都已经过很多工程师的测试。缓存算法是高中课程的一部分。您的解决方案将无限度地消耗RAM,并且在没有更多RAM可用时会导致崩溃。而user2311285则表示,仅hastable一项“并不令人信服”。