Не могли бы вы использовать два параллельных массива? Т.е.,
// assuming no reallocation required
#define BUFFERSIZE some-gigantic-number
char upstream[BUFFERSIZE];
char downstream[BUFFERSIZE];
Затем расположите каждый список MAC-адресов в виде последовательных символов. Например:
upstream:
"01:23:45:67:89:ab\000:0d:93:81:d9:7c\0..."
|_______________| |_______________|
| |
first address second address ...
downstream:
"00:0a:95:d1:52:30\001:45:c3:2d:65:b5\0..."
|_______________| |_______________|
| |
first address second address ...
Расположите и upstream
, и downstream
таким образом, чтобы парные MAC-адреса были в одном порядке.
Теперь, чтобы найти спаренный MAC-адрес, просто используйте strcmp()
или аналогичный, чтобы проверить каждый MAC-адрес в одном массиве. Как только ключ найден, этот же индекс в дополнительном массиве является значением.
Почему это так? Это почти не требует вспомогательной памяти и очень эффективно кеширует.