Size: a a a

2021 July 18

СА

Сергей Аксёнов... in ctodailychat
Вот да. UUID в урлах бесят неиллюзорно.
источник

IV

Igor V in ctodailychat
Разговоры про секьюрные айдишники напоминают двойной md5 у битрикса

“Для доступа к Битрикс24 используется разграничение прав пользователей и шифрование паролей через двойной md5. “
источник

AR

Anton Revyako in ctodailychat
у любого другого хеша они будут ровно такими же начиная с некоторого размера.

понятно, что я скорее о pg (в mysql нет uuid, в монге хз). в pg я uuid сгенерю на лету как дефолт, а с этими хистерскими хешами придется 2 раза в базу ходить )

не считая того, что он просто молча сломаться может )
console.log(hashids.encode(9223372036854775807));

вернет ничего.

ps: https://t.me/hot_backenderr/29
Telegram
Типа крутой бэкендер
Сравнение UUID

Есть два UUID'a:
1) 898b178f-f694-4a78-ac20-3f5c6ab55e77
2) 2eb2c8db-e826-4424-8287-aae6f8d3b8c7

Как думаете, если их сравнить в Java (через стандартный компаратор) и в PostgreSQL - результат будет одинаковый? Проверим?

Java (Kotlin):
first.compareTo(second)

PostgreSQL:
select (:first)::uuid > (:second)::uuid

Результаты:
Java вернет -1, т.е первый меньше второго
PostgreSQL вернет true, т.е первый больше второго

Надеюсь, это избавит кого-то от 4 часов дебага. Проблему нашли, но легче не стало. Давайте разбираться, почему так получилось и кто прав.

Идем в исходники PostgreSQL, находим там метод uuid_internal_cmp, видим что он вызывает C'шный memcmp и сравнивает байтики обоих uuid'ов. Выглядит логично.

Идем в исходники Java. Сначала стоит обратить внимание на то, как в UUID'е хранятся данные.
public final class UUID {
 private final long mostSigBits;
 private final long leastSigBits;
}

Смотрим реализацию метода compareTo(). Копипастить код сюда не буду, покажу лишь коммент:
// The ordering…
источник

ΠΣ

Παύλος ☃️ Σ... in ctodailychat
Не секьюрно с какой точки зрения? Ключ общий, IV разные
источник

AR

Anton Revyako in ctodailychat
это только для староверов :) ты еще скажи что домен только в зоне .com должен быть )
источник

ΠΣ

Παύλος ☃️ Σ... in ctodailychat
В монге есть uuid тип
источник

AR

Anton Revyako in ctodailychat
осталось как-нибудь проверить, что он его строкой не хранит )
источник

ΠΣ

Παύλος ☃️ Σ... in ctodailychat
Не хранит, проверено
источник

СА

Сергей Аксёнов... in ctodailychat
В Монге божественный MongoDB ID, который, например, можно безбоязненно генерить на клиенте. В нем зашит Unix timestamp, по которому можно сортировать.
источник

AR

Anton Revyako in ctodailychat
гад блесс ю с вашей монгой )
источник

ΠΣ

Παύλος ☃️ Σ... in ctodailychat
Строкой у нас тоже есть легаси, там индексы пухнут 🙈
источник

СА

Сергей Аксёнов... in ctodailychat
Это на усмотрение разработчика. Рекомендуют хранить в бинарном виде, но можно извернуться и положить строкой.
источник

ΠΣ

Παύλος ☃️ Σ... in ctodailychat
Но отдавать его наружу может быть плохо по этой же причине
источник

СА

Сергей Аксёнов... in ctodailychat
Для ID пользователей - да, по нему можно понять, в каком порядке они появлялись. А для постов и комментов - только в путь.
источник

AR

Anton Revyako in ctodailychat
в интернетах вон статья расходится как мильярд записей в sqlite за минуту вставить. а вы тут с монгой )
источник

K

Kirill in ctodailychat
Только там не мильярд все же
источник

AR

Anton Revyako in ctodailychat
Inserting One Billion Rows in SQLite Under a Minute
источник

K

Kirill in ctodailychat
Да, но в статье 100млн
источник

AR

Anton Revyako in ctodailychat
я ж ее не читал )))
источник

ΠΣ

Παύλος ☃️ Σ... in ctodailychat
Я бы ещё добавил что ты описал современный вариант генерации монговского objectid, а до 3.4 он иначе генерился, там вместо рандомной части были id машины/процесса - не очень хорошо в общем
источник