Основан на алгоритме Twitter-Snowflake, с расширенными деталями. Конкретная структура представлена ниже:
Как показано на рисунке, 64 бита разделены на четыре части.
- Миллисекундный таймштамп, состоящий из 42 бит. Это позволяет использовать его в течение 139 лет, начиная с 1970 года, до 2109 года. Эти сроки могут быть расширены путём указания начального времени.
- Самостоятельный идентификатор узла, чтобы предотвратить повторение ID при работе нескольких процессов, занимает 12 бит и может поддерживать 4096 узлов. При установке можно настроить id сервера.
- Внутрипроцессный счетчик миллисекунд, занимающий 10 бит, что позволяет создавать 1024 ID за каждую миллисекунду. То есть, одновременно за секунду можно создать до 1024000 ID.
100%-гарантированная уникальность, обеспечиваемая различием nodeid для гарантии уникальности между несколькими серверами, а также использованием общего памяти + спин-лок для гарантии уникальности внутри одного узла при работе нескольких процессов. Уникальность внутри одной миллисекунды гарантирована благодаря увеличивающемуся счетчику.## Использование
Склонируйте код на локальную машину, перейдите в директорию проекта и выполните следующие команды:
cd ./donkeyid
/path/to/phpize
./configure --with-php-config=/path/to/php-config
make
make install
echo "extension=donkeyid.so" >> /path/to/php.ini
DonkeyId имеет три режима генерации ID:
- По умолчанию используется первый режим, который был описан выше (для MySQL используйте поле BIGINT(20)). dk_get_next_id().
- Второй режим — десятичная система, которая создаёт ID до 20 цифр (для MySQL используйте VARCHAR(20)). От правого края начинается время в секундах, затем идёт ID узла (трёхзначное число, максимум до 999), далее — увеличивающееся значение внутри секунды (от второй цифры до шестой), последняя цифра — это пользовательская цифра. Например, 2016053010150316300120001. dk_get_ts_id().
- Третий режим — строковый, создаёт 25-значный ID, где первые 17 символов представляют год, месяц, день, час, минуту, секунду и миллисекунду, следующие 4 символа — это ID узла, последние 4 символа — увеличивающееся значение внутри миллисекунды (для MySQL используйте VARCHAR(25)). dk_get_dt_id().
Настройка узлового ID в файле
php.ini
[DonkeyId]
;0-4095
donkeyid.node_id=0
;0-текущее время
donkeyid.epoch=0
```#### API Интерфейсы
* dk_get_next_id()
> Получение ID на основе алгоритма Snowflake
* dk_get_next_ids($num, $time=0)
> Получение списка ID на основе алгоритма Snowflake. $num: количество генерируемых ID, $time: время генерации ID. По умолчанию $time равно 0, что означает генерацию текущего времени.
* dk_parse_id($id)
> Разбор метаданных ID на основе алгоритма Snowflake. Возвращаемое значение включает: time — время создания ID, node_id — узловой ID, sequence — последовательность.
* dk_get_ts_id()
> Получение десятичного ID с временной меткой
* dk_get_ts_ids($num, $time=0)
> Получение списка десятичных ID с временной меткой. $num: количество генерируемых ID, $time: время генерации ID. По умолчанию $time равно 0, что означает генерацию текущего времени.
* dk_parse_ts_id($tsid)
> Разбор метаданных десятичного ID с временной меткой. Возвращаемое значение включает: time — время создания ID, node_id — узловой ID, sequence — последовательность.
* dk_get_dt_id()
> Получение строки ID, явно содержащей атрибуты даты и времени
#### Пример тестового кода
```php
$nextid = dk_get_next_id();
echo "nextid:" . $nextid . "\n";
print_r(dk_parse_id($nextid));
$tsid = dk_get_ts_id();
echo "tsid:" . $tsid . "\n";
print_r(dk_parse_ts_id($tsid));
$dtid = dk_get_dt_id();
echo "dtid:" . $dtid . "\n";
echo "nextids:\n";
print_r(dk_get_next_ids(100, 1470298401));
echo "nextids2:\n";
print_r(dk_get_next_ids(100));
echo "tsids:\n";
print_r(dk_get_ts_ids(100, 1470298401));
echo "tsids2:\n";
print_r(dk_get_ts_ids(100));
Поддерживает PHP 5.3+ и PHP 7 - 7.4
Поддерживает PHP 8
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )