Skip to content

Replace JSON MAC vendor database with compact binary lookup - #17

Merged
juriyivanov merged 23 commits into
mainfrom
feature/compact-mac-vendor-db
Sep 17, 2026
Merged

juriyivanov merged 23 commits into
mainfrom
feature/compact-mac-vendor-db

Conversation

@juriyivanov

@juriyivanov juriyivanov commented Sep 17, 2026 •

Copy link
Copy Markdown
Owner

Что изменено

  • заменён oui-db.json (5,636,609 байт) на компактный oui-db.bin.gz (503,496 байт), то есть примерно на 91.1% меньше исходной JSON-базы;
  • внутренний бинарный payload после распаковки занимает 974,550 байт; gzip дополнительно уменьшает его ещё примерно на 48.3%;
  • перенесён подход из NetRunner: longest-prefix /36 -> /28 -> /24, отсортированные бинарные prefix-records и бинарный поиск прямо по ArrayBuffer;
  • записи префиксов занимают ровно нужный размер: /24 = 3+2 байта, /28 = 4+2, /36 = 5+2, где последние 2 байта это uint16 vendor_id;
  • строки производителей дедуплицированы и front-coded блоками по 32 записи;
  • vendor-блок декодируется лениво только при реальном lookup и кешируется;
  • gzip распаковывается нативным DecompressionStream('gzip'); перед распаковкой проверяется gzip magic, поэтому код нормально переживает и хостинг/CDN, который уже распаковал тело сам;
  • основной существующий UI/runtime сохранён в app-core.js, а app.js стал компактным loader/compatibility layer;
  • исправлена гонка динамической загрузки app-core.js после DOMContentLoaded, обнаруженная на GitHub Pages, и добавлен regression-тест;
  • версия приложения поднята до 3.16;
  • PWA cache переведён на oui-db.bin.gz и обновлён до ipcalc-pwa-v25;
  • Standalone Full вшивает gzip-базу в Base64 и получился около 764.5 KiB вместо прежних ~1.34 MiB; Lite остаётся около 93 KiB без vendor DB;
  • генератор tools/build-oui-db.py по умолчанию собирает oui-db.bin.gz с gzip level 9 и умеет также писать raw binary при другом расширении;
  • добавлены проверки gzip-контейнера и структуры распакованной DB: magic/version, offsets, SHA-256 payload, сортировка prefix tables, диапазон vendor IDs и декодирование всех front-coded vendor strings.

Формат v2

После распаковки IPCOUI02, header 96 bytes:

  • /24: 3-byte big-endian prefix + LE uint16 vendor_id
  • /28: 4-byte big-endian prefix + LE uint16 vendor_id
  • /36: 5-byte big-endian prefix + LE uint16 vendor_id
  • vendor strings: blocks of 32, block offset index (uint32), затем uint16 common_prefix_len + uint16 suffix_len + suffix

Поведение MAC Vendor / Formats и longest-prefix matching для пользователя не меняется.

@juriyivanov
juriyivanov merged commit 3a9a19e into main Sep 17, 2026
4 checks passed

This branch was successfully deployed

1 active deployment
github-pages — c515ce4d Deployed Sep 17, 2026 by juriyivanov via deploy #82
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant