Использование метки времени в качестве уникального идентификатора никогда не будет работать надежно, если вы не ограничите себя только одной транзакцией на самый низкий такт (в данном случае 1 миллисекунду).
Поскольку вы застряли, используя значение времени для первых 6 из 9 байтов, вам нужно попытаться вписать как можно больший диапазон в последние 3 байта.
Если вы можете избежать использования символов ASCII в последних 3 байтах, вам следует избегать этого, поскольку это ограничит значения, которые могут иметь большое значение. Если возможно, вы должны попытаться использовать эти байты как 24-битное целое число (диапазон 16777216) и просто сделать каждую транзакцию увеличивающей счетчик. Затем вы можете установить его обратно в 0 каждый раз, когда gettimeofday сообщит вам, что время изменилось. (или вы можете настроить повторяющийся SIGALRM, чтобы сообщить, когда снова вызывать gettimeofday для обновления вашего времени и 0 для 24-битного целого числа).
Если вы вынуждены использовать печатные символы ASCII для этих байтов, тогда все немного сложнее. Самый простой способ расширить диапазон этого - использовать шестнадцатеричные, а не десятичные числа. Это увеличивает ваш представительный диапазон с 1000 до 4096. Вы можете добиться большего успеха, если используете еще более широкую базу номеров. Если вы добавили первые 22 символа алфавита (точно так же, как для шести первых букв), вы можете представить 32x32x32
значений, что составляет 32768. Это будет много транзакций в секунду. Вы можете сделать еще лучше, если расширите числовой алфавит еще больше, но он станет более частичным, поскольку вы, вероятно, захотите ограничить отображение некоторых символов в значении. Использование представления, с которым strtol
или strtoul
может легко работать, вероятно, будет проще для программирования.
Если ваше приложение является многопоточным, то вы можете рассмотреть возможность использования части вашего числового диапазона в качестве идентификатора потока и позволить каждому потоку хранить свой собственный счетчик транзакций. Это сделает определение относительного времени между двумя транзакциями, обработанными разными потоками, более сложным для вычисления, но при этом не позволит потокам увеличивать одно и то же место в памяти (что может потребовать мьютекса или семафора).