Хочу генерировать ключ объекта 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. Может кто то решал подобную задачу? Спасибо за внимание.
На 64-разрядных платформах int 64-разрядный. Также можно использовать 8-байтовые строки. Не слишком ли мало для ключа 64 разряда? В БД тоже можно хранить в бинарных строках (BINARY, VARBINARY) в упакованном виде или в любом символьном формате в распакованном виде. Я обычно храню ключи в БД в распакованном виде в 32- или 64-ричной системе счисления. --- Добавлено --- Т.е. 5 или 6 значащих бит в байте.
Да вроде не мало 64 разряда. Собственно идея взята от инстаграмских разрабов, здесь ссылка https://instagram-engineering.com/sharding-ids-at-instagram-1cf5a71e5a5c. Они еще и шардинг добавляют в 64 бита, так что вообще должно хватать. Основная проблема для меня - отсутствие в PHP гарантированного int64, так что видимо придется с ключом в PHP оперировать как со строкой, но в БД хочется хранить его в численном виде, все же, чтобы при индексировании, поиске и прочем не было проблем со страницей кодировки. Хотя опять же, если строка состоит исключительно из символов цифр, то таких проблем и не должно быть. Мой прошлый опыт по Delphi + MS SQL здесь как то слабо помогает )