1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/osgochina-donkeyid

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

DonkeyID --- PHP расширение-генератор уникальных 64-битных ID

0.7 версия доступна здесь

Принцип работы

Основан на алгоритме Twitter-Snowflake, с расширенными деталями. Конкретная структура представлена ниже:

bits.jpg

Как показано на рисунке, 64 бита разделены на четыре части.

  1. Миллисекундный таймштамп, состоящий из 42 бит. Это позволяет использовать его в течение 139 лет, начиная с 1970 года, до 2109 года. Эти сроки могут быть расширены путём указания начального времени.
  2. Самостоятельный идентификатор узла, чтобы предотвратить повторение ID при работе нескольких процессов, занимает 12 бит и может поддерживать 4096 узлов. При установке можно настроить id сервера.
  3. Внутрипроцессный счетчик миллисекунд, занимающий 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:

  1. По умолчанию используется первый режим, который был описан выше (для MySQL используйте поле BIGINT(20)). dk_get_next_id().
  2. Второй режим — десятичная система, которая создаёт ID до 20 цифр (для MySQL используйте VARCHAR(20)). От правого края начинается время в секундах, затем идёт ID узла (трёхзначное число, максимум до 999), далее — увеличивающееся значение внутри секунды (от второй цифры до шестой), последняя цифра — это пользовательская цифра. Например, 2016053010150316300120001. dk_get_ts_id().
  3. Третий режим — строковый, создаёт 25-значный ID, где первые 17 символов представляют год, месяц, день, час, минуту, секунду и миллисекунду, следующие 4 символа — это ID узла, последние 4 символа — увеличивающееся значение внутри миллисекунды (для MySQL используйте VARCHAR(25)). dk_get_dt_id().

Запуск

  • Обратите внимание, данное расширение не поддерживает безопасный многопоточный режим PHP, поэтому следует использовать его вне этого режима.

Конфигурация

Настройка узлового 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Расширение PHP, генератор 64-битных идентификаторов с автоинкрементом. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/osgochina-donkeyid.git
git@api.gitlife.ru:oschina-mirror/osgochina-donkeyid.git
oschina-mirror
osgochina-donkeyid
osgochina-donkeyid
master