В настоящее время я пытаюсь реализовать алгоритм выбора уникального (16-битного) идентификатора. Задача состоит в том, чтобы сделать это быстро, не используя слишком много памяти. Список используемых в настоящее время идентификаторов определяется путем сканирования внешнего флэш-устройства с помощью последовательности транзакций SPI и, следовательно, является относительно медленным процессом. Кроме того, алгоритм будет работать на небольшом микроконтроллере, поэтому я не могу просто прочитать все записи в ОЗУ и обработать их там.
Мысли, которые у меня были до сих пор:
- Выберите номер, затем просмотрите список и посмотрите, используется ли он. Промыть и повторить. Страдает довольно медленно (особенно если файлов много).
- Как и выше, но выберите число с помощью генератора псевдослучайных чисел с соответствующим начальным числом. Это имеет то преимущество, что меньше вероятность того, что будет такое большое количество итераций.
- Просмотрите список и заполните массив всеми найденными записями. Отсортируйте его, и тогда он станет тривиальным. Это может использовать огромное количество памяти.
- Используйте огромную (хорошо, смехотворно огромную) битовую маску. Не совсем практично.
- Примите тот факт, что срок службы инструмента таков, что он будет выброшен или «отформатирован» задолго до того, как он запишет 65534 файла во флэш-память, поэтому просто сохраните максимальное значение, использованное до сих пор, во флэш-памяти или в резервной памяти и продолжайте увеличивать . Честно говоря, это, вероятно, будет хорошо работать для этого конкретного приложения.
На данный момент я склоняюсь к использованию либо второго, либо пятого, но мне было бы интересно узнать, есть ли у кого-нибудь другие мысли. Я хотел бы думать, что существует алгоритм, похожий по форме на CRC, который можно было бы использовать для обработки каждого числа по очереди и дать четкое представление о числе, которое не использовалось, но я понятия не имею, как это может быть. работай.