За последние 24 часа нас посетили 22494 программиста и 1090 роботов. Сейчас ищут 660 программистов ...

Генерация ключа int64

Тема в разделе "PHP и базы данных", создана пользователем Кропотов, 17 янв 2019.

  1. Кропотов

    Кропотов Новичок

    С нами с:
    17 янв 2019
    Сообщения:
    2
    Симпатии:
    0
    Хочу генерировать ключ объекта PHP до его сохранения в таблице, автоинкрементное поле не хочу использовать. Поле ключа в таблице типа BIGINT, 8 байт.

    Значение генерируется в PHP по такой схеме:
    1. Берем time() и вычитаем количество секунд до 2016-01-01. Получаем номер секунды с 1 января 2016 года.
    2. Берем microtime(), из него извлекаем миллисекунды, умножаем на 1000, округляем до целого, расширяем слева нулями до 3 знаков и приклеиваем к секундам.

    - получили кол-во миллисекунд с 2016-01-01.

    3. Далее генерим случайное целое от 1 до 999, расширяем слева нулями до 3 знаков и приклеиваем к миллисекундам справа.

    - этим пытаемся исключить дубли ключей, созданных в рамках одной миллисекунды.

    Получили ключ, который а) последовательный (до 3 последних знаков) и б) псевдоуникальный.

    Внимание, вопрос:

    В PHP нет int64 в чистом виде.

    Какие есть варианты решения?

    Что приходит в голову - в объекте PHP хранить ключ как строку из цифр, в БД хранить как BIGINT.

    Может кто то решал подобную задачу?

    Спасибо за внимание.
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    На 64-разрядных платформах int 64-разрядный. Также можно использовать 8-байтовые строки.

    Не слишком ли мало для ключа 64 разряда?

    В БД тоже можно хранить в бинарных строках (BINARY, VARBINARY) в упакованном виде или в любом символьном формате в распакованном виде. Я обычно храню ключи в БД в распакованном виде в 32- или 64-ричной системе счисления.
    --- Добавлено ---
    Т.е. 5 или 6 значащих бит в байте.
     
  3. Кропотов

    Кропотов Новичок

    С нами с:
    17 янв 2019
    Сообщения:
    2
    Симпатии:
    0

    Да вроде не мало 64 разряда. Собственно идея взята от инстаграмских разрабов, здесь ссылка https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c. Они еще и шардинг добавляют в 64 бита, так что вообще должно хватать.

    Основная проблема для меня - отсутствие в PHP гарантированного int64, так что видимо придется с ключом в PHP оперировать как со строкой, но в БД хочется хранить его в численном виде, все же, чтобы при индексировании, поиске и прочем не было проблем со страницей кодировки. Хотя опять же, если строка состоит исключительно из символов цифр, то таких проблем и не должно быть.

    Мой прошлый опыт по Delphi + MS SQL здесь как то слабо помогает )