Sqids - это небольшая библиотека с открытым исходным кодом, которая может создавать короткие, уникальные и случайные идентификаторы из чисел.
Лучший способ понять это - это как конвертер из десятичной в шестнадцатеричную систему с несколькими дополнительными функциями.
Для сокращения ссылок, генерации уникальных идентификаторов событий для журналирования, генерации идентификаторов для продуктов/объектов на веб-сайте (как делает YouTube для видеороликов), генерации коротких идентификаторов для текстовых сообщений, кодов подтверждения в электронных письмах и т. д.
Любые данные, которые не являются конфиденциальными. Сгенерированные идентификаторы не являются хэшами и могут быть раскодированы обратно в числа. Например, они могут не подходить для идентификаторов пользователей, потому что после декодирования они могут раскрыть количество пользователей вашего приложения.
Да, Sqids может кодировать одно или несколько неотрицательных чисел в один идентификатор. Нет ограничений на количество чисел, которые вы можете закодировать, но есть ограничение на размер числа (в зависимости от языка реализации).
Это полезно по нескольким причинам: вы можете закодировать временную метку UNIX и создать идентификаторы с ограниченным сроком действия, или вы можете закодировать номер базы данных вместе с первичным ключом и сэкономить на дополнительных запросах к базе данных.
Да, сгенерированные идентификаторы уникальны для входных данных и алфавита.
Тем не менее, стандартный алфавит содержит как строчные, так и прописные буквы, поэтому идентификаторы регистрозависимы.
Sqids не может кодировать отрицательные числа.
Минимальная длина алфавита - 3 символов.
Алфавит не может содержать многобайтовые символы.
Sqids не может генерировать идентификаторы до определенной длины, только как минимум определенной длины. Диапазон параметра минимальной длины составляет от 0 до 255.
Sqids может попытаться восстановить идентификаторы до длины алфавита минус один.
Библиотека принимает пользовательский алфавит, из которого можно генерировать идентификаторы. Просто предварительно перемешайте стандартный алфавит, предоставленный.
Пожалуйста, имейте в виду, что при достаточных усилиях кто-то может провести обратную инженерию вашего перемешанного алфавита, поэтому это ни в коем случае не приемлемый способ скрыть конфиденциальные данные.
Стандартный алфавит можно найти здесь .
Вы можете использовать любые онлайн-инструменты для перемешивания строк или наш плейграунд .
Зависит от вашего случая использования. Более короткий алфавит создаст более длинные идентификаторы, а более длинный алфавит создаст более короткие идентификаторы. Вы можете использовать плейграунд , чтобы протестировать, как будут выглядеть ваши идентификаторы.
Да. Имейте в виду, что сгенерированные идентификаторы всё равно будут строками, и они могут начинаться с нуля.
Нет. Sqids не поддерживает многобайтовые символы для алфавита. Сюда также относятся эмодзи, а также многие другие символы.
Библиотека может расширять идентификаторы ненужными символами, чтобы они выглядели длиннее. Это полезно, чтобы было не так очевидно, кодируете ли вы маленькое число, такое как 1, или большое число, такое как 1000000.
Декодирование не затрагивается.
Да, библиотека принимает параметр минимальной длины, который гарантирует, что идентификаторы будут как минимум такой длины.
Имейте в виду, что нет гарантии на длину ваших идентификаторов - только то, что они не будут короче указанной вами длины.
До определенного предела.
Установка максимальной длины невозможна, потому что рано или поздно ваши идентификаторы превысят допустимую длину при достаточно большом входе данных. Поэтому поддерживается только параметр минимальной длины, и точная или максимальная длина не поддерживается.
Список блокировки может предотвратить появление определенных слов в ваших идентификаторах. Это полезно, потому что сгенерированные идентификаторы должны появляться в публичных местах, таких как URL.
Sqids поставляется со стандартным списком блокировки , который содержит наиболее распространенные ненормативную лексику и неподобающие слова из нескольких языков. Конечно же, вы можете расширить этот список собственными словами.
Сопоставление слов из списка блокировки не зависит от регистра.
Короткие слова, менее 3 символов, не будут заблокированы. Слова длиной 3 символа должны полностью совпадать с идентификатором. Слова длиной 4 символа или более будут считаться соответствующими, если они являются подстрокой идентификатора.
Если слова из списка блокировки содержат цифры (leet-язык), они будут считаться соответствующими, только если они находятся в начале или в конце идентификатора.
Стандартный список блокировки содержит наиболее распространенную ненормативную лексику и неподобающие слова из нескольких языков. Полный список можно найти здесь .
Когда сгенерированный идентификатор соответствует слову в черном списке, библиотека пытается его восстановить.
Если каждая попытка восстановить идентификатор не удалась, функция кодирования завершится неудачно и вернет ошибку. Обработка этой ошибки зависит от пользователя.
Лучший способ уменьшить количество попыток регенерации — использовать более длинный алфавит, не устанавливать минимальную длину и предоставить меньший черный список. Предоставление пустого черного списка приведет к полному отключению этой функции.
Декодирование идентификаторов обычно дает какой-то числовой результат, но это не обязательно означает, что идентификатор является каноническим. Чтобы проверить корректность идентификатора, вы можете перекодировать декодированные числа и проверить соответствие идентификатора.
Причина, по которой это не делается автоматически, заключается в том, что если черный список по умолчанию изменится в будущем, мы не хотим автоматически аннулировать идентификатор, который был сгенерирован в прошлом и теперь может соответствовать новому слову черного списка.
Мы обязательно обновим CHANGELOG, когда и если изменится черный список по умолчанию.
Вы должны учитывать сценарии, в которых новое слово может быть добавлено в черный список по умолчанию. В этом случае перекодирование чисел может привести к получению другого идентификатора.
Лучший способ обеспечить согласованность ваших идентификаторов в будущих обновлениях — предоставить собственный черный список, даже если он идентичен текущему черному списку по умолчанию.
Нет, кодирование разных чисел приведет к созданию уникальных идентификаторов.
Однако из-за конструкции алгоритма декодирование случайных идентификаторов иногда может давать одни и те же числа. Лучший способ проверить каноничность идентификатора — просто перекодировать декодированные числа и проверить совпадение идентификатора.
Hashids была первой версией этой библиотеки, вышедшей примерно в 2013 году. Она также создавала короткие идентификаторы, но использовала немного другой метод.
Hashids обрабатывает некоторые вещи по-другому.
Он не поддерживал собственный черный список, а вместо этого использовал наиболее распространенные английские ненормативную лексику. Он также использовал параметр salt для перетасовки алфавита, что немного сбивало с толку, поскольку библиотека не имеет ничего общего с шифрованием. Кроме того, было использовано слишком много зарезервированных символов, что привело к созданию более длинных идентификаторов.
Поэтому мы решили обновить и провести ребрендинг. Алгоритм был упрощен, добавлено несколько функций, и все репозитории кода теперь находятся под одной крышей .
Параметр salt использовался для перетасовки алфавита и никогда не предназначался для связи с безопасностью. И Hashids, и Sqids работают аналогично преобразованию десятичных чисел в шестнадцатеричные, но с некоторыми изменениями. Никакого шифрования не существует, поэтому во избежание путаницы этот параметр полностью удален.
Нет, Sqids расширяет функциональность Hashids и имеет другие цели и требования к дизайну; следовательно, сгенерированные идентификаторы несовместимы с Hashids.
Поскольку между Hashids и Sqids нет совместимости, невозможно просто заменить Hashids на Sqids.
Однако вы можете объединить их, определив, какой идентификатор принадлежит какой библиотеке.
Один из способов сделать это — использовать длину идентификатора: если вы переключаетесь на Sqids, вы можете указать более высокую минимальную длину. Другой способ — вручную добавить собственный символ к вновь сгенерированным идентификаторам.
Наконец, вы также можете попытаться декодировать идентификатор с помощью Hashids, чтобы проверить, действителен ли он. Если нет — декодируйте и перекодируйте с помощью Sqids, чтобы проверить, работает ли это.
Каждая языковая реализация на этом веб-сайте ссылается на исходный репозиторий Hashids, если он существует.
Если вы хотите поддержать проект, мы будем признательны за пометку наших репозиториев на Github для большей наглядности.
Если вы разработчик и не видите реализации Sqids для определенного языка, помогите нам преобразовать библиотеку. То же самое касается языка программирования, которого нет в списке.
Если вы видите ошибку в спецификации или какой-либо реализации, создайте проблему или запрос на включение с предлагаемым исправлением в соответствующем репозитории.
Если вы говорите на нескольких языках, нам может пригодиться ваша помощь в тонкой настройке черного списка и корректировке переводов веб-сайтов , если вы обнаружите какие-либо проблемы.
Наконец, если у вас есть некоторый опыт работы с Hashids/Sqids, пожалуйста, помогите нашему сообществу, ответив на любые вопросы, которые могут возникнуть у кого-либо.
Если вы хотите перенести Sqids на один из следующих языков (или новый, не указанный здесь):
D , Io , Raku , Smalltalk , T-SQL , Tcl , VBA
Создайте форк официального репозитория в своей учетной записи Github и внедрите спецификацию вместе со всеми тестами. Вы можете повторно использовать любой из существующих файлов README (пример ).
Как только библиотека будет готова, создайте запрос на включение. После объединения мы обновим сайт.
Если у репозитория нет активных сопровождающих, мы будем рады предложить вам управлять репозиторием и стать официальным сопровождающим.