你会如何设计一个mac地址表(本质上是一个快速查找表)?

时间:2016-09-30 17:50:36

标签: data-structures software-design

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

enter image description here

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

3 个答案:

答案 0 :(得分:1)

对于纯软件解决方案,我也会使用哈希表。但是交换机是一种专用硬件,它们是大批量生产的。因此,为它们开发专用的内存硬件是合理的。接下来的事情是你需要一个类似的CPU缓存硬件,因为当你需要从RAM中获取东西时,你首先需要找出缓存行是否被加载到缓存中。

有了这些知识,您可以前往wikipediathis article

更新:在搜索MAC地址旁边,您必须删除旧条目以防止您的表变得太大。可能你还没有描述如何做到这一点,并期待你的LRU缓存。 LRU可以在哈希表上实现,只需为删除队列添加额外的链表。或者您可以使用棘手的冲突解决策略制作哈希表,而不是LRU:拥有固定数量的存储桶并限制存储桶大小。如果桶已满,请从中丢弃。

答案 1 :(得分:0)

您可以使用C ++或map< class_representing_entry, int >中的哈希表(HashMap< Class_representating_entry, Integer > in java)。

这里的关键部分是具有适当的散列函数,例如您可以使用vlan和mac地址的组合,在O(1)

中有效地进行查找

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

答案 2 :(得分:0)

值得注意的是,蛮力的阵列/列表可能会出乎意料地快 - “成千上万的项目”并不多。

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

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