о вашем CRC, как алгоритм интереса ...
Похоже, вы ищете алгоритм, который будет выполнять случайный список из менее чем 64K 16-разрядных чисел и генерировать новое 16-разрядное число, которого еще нет в списке; желательно делать это за один проход по заданному списку.
Если последовательность, в которой освобождаются идентификаторы, не имеет отношения к последовательности, в которой они распределены (как я считаю, это ваш случай), вы ничего не можете сделать с генерацией или распределением идентификаторов, чтобы получить ваш алгоритм.
Лучшей ставкой тогда будет 5 из вашего списка.
Если вы любите приключения ...
и, если вы можете изменить нумерацию своих идентификаторов (то есть изменить выделенный идентификатор на другой нераспределенный идентификатор), вы можете время от времени запускать итерацию типа «дефрагментации», чтобы переместить все распределенные идентификаторы в более низкие значения и найти самый высокий бесплатный идентификационный номер для следующего распределения. Это помогло бы запомнить общее количество выделений и освобождений, выполненных с момента последнего такого прогона «дефрагментации». Выделяем инкремент последовательно, начиная с 0.
Таким образом, вам нужно запомнить только 3 беззнаковых коротких целых числа в памяти. И да, время от времени выполняйте немного дорогостоящую итерацию перераспределения, основываясь на их значениях.