powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод UUID
25 сообщений из 39, страница 1 из 2
Вывод UUID
    #40031236
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinAPI UuidToString: 6eac0df7-46d2-11eb-8287-2c44fdb89adb
Firebird gstat: 0DF76EAC-46D2-11EB-8782-442CB8FDDB9A
Firebird UUID_TO_CHAR: F70DAC6E-D246-EB11-8287-2C44FDB89ADB

Забавный зоопарк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031351
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и храню прилетающие из всяких ЭДО, црпт, своих сайтов и т.п. ууид-ы прямо в строках, как есть, иначе потом концов хрен сыщешь.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031361
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
firebird>gstat -h Z:\TEMP\MEM40.FDB

Database "Z:\TEMP\MEM40.FDB"
Gstat execution time Sat Dec 26 12:07:52 2020

...
    Variable header data:
        Database GUID:   {D60E1149-EB9E-415D-C3BE-4035451D3C9D} 

firebird>isql Z:\TEMP\MEM40.FDB
Database: Z:\TEMP\MEM40.FDB, User: SYSDBA
SQL> set list;
SQL> select * from mon$database;
...
MON$GUID                         {D60E1149-EB9E-415D-C3BE-4035451D3C9D} 
...
Рейтинг: 0 / 0
Вывод UUID
    #40031365
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladMON$GUID {D60E1149-EB9E-415D-C3BE-4035451D3C9D}
Код: plaintext
1.
2.
	GuidToString(guidBuffer, &dbb->dbb_guid);
	record.storeString(f_mon_db_guid, string(guidBuffer));


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Warning: they are BROKEN in little-endian and should not be used on new code.

inline void GuidToString(char* buffer, const Guid* guid)
{
	sprintf(buffer, GUID_LEGACY_FORMAT,
		guid->data[0], guid->data[1], guid->data[2], guid->data[3],
		guid->data[4], guid->data[5], guid->data[6], guid->data[7]);
}
...
Рейтинг: 0 / 0
Вывод UUID
    #40031380
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тот, кто фиксил UUID_TO_CHAR, забил на все остальные места где юзаются GUIDы. А дальше всё шло по накатанной :-)
...
Рейтинг: 0 / 0
Вывод UUID
    #40031383
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> забил на все остальные места где юзаются GUIDы

Это может чем-то аукнуться конечным пользователям?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031384
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот поэтому хотя бы fb_info_db_guid стоило отдавать в честном двоичном виде...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031385
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

про это я думал. Но нафига, если во всех остальных местах оно юзается как строки. Кто это будет конвертить? А если сконвертит не так, как движок? Щаз пусть и неправильно, но хоть единообразно и совместимо во все стороны :-)

ЗЫ. хотя конечно в мажорном релизе все это можно было бы перепахать по-правильному. Ладно 2.5.2, там в rdb$backup_history могли лежать записи и ломать nbackup не стоило. Но вот почему мы на это забили в 3.0 - надо копать архивы.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031387
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrНо нафига, если во всех остальных местах оно юзается как строки.

А я в FireSwarm собираюсь использовать БД UID как часть глобального идентификатора
транзакции везде, включая хранилище и сетевой протокол. Поэтому хочется его иметь размером
в 16 байт, а не 36. Придётся копипастить код из движка и надеяться, что вам и дальше будет
лень этот зоопарк вычищать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031407
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простой вариант без перепахивания - добавить другую функцию. Назвать, например, UUID_TO_STR. И пусть она повторяет поведение WinAPI. А UUID_TO_CHAR пусть останется для совместимости со старыми базами и приложениями.

Ivan_Pisarevsky
Вот и храню прилетающие из всяких ЭДО, црпт, своих сайтов и т.п. ууид-ы прямо в строках, как есть, иначе потом концов хрен сыщешь.


Они жрут много места, не сжимаются, но OCTETS хотя бы раза в 2 меньше.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031442
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А я в FireSwarm собираюсь использовать БД UID как часть глобального идентификатора
транзакции везде, включая хранилище и сетевой протокол. Поэтому хочется его иметь размером
в 16 байт, а не 36.

и это правильно
Придётся копипастить код из движка и надеяться, что вам и дальше будет
лень этот зоопарк вычищать.
PR бы лучше замутил, чем многослойные грабли строить...
...
Рейтинг: 0 / 0
Вывод UUID
    #40031444
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrPR бы лучше замутил, чем многослойные грабли строить...

На ещё один info item?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031448
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на замену GUID_LEGACY_FORMAT на GUID_NEW_FORMAT внутри Guid* функций (и выкидывание GUID_LEGACY_FORMAT к чертовой бабушке). Или я слишком категоричен? ГУИДы у нас через бекап не передаются, так что проблем с совместимостью быть не должно вроде.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031466
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrна замену GUID_LEGACY_FORMAT на GUID_NEW_FORMAT внутри Guid* функций (и выкидывание
GUID_LEGACY_FORMAT к чертовой бабушке). Или я слишком категоричен? ГУИДы у нас через бекап
не передаются, так что проблем с совместимостью быть не должно вроде.

Там, видишь ли, проблема несколько более комплексная, чем преобразование. По уму надо бы
перепахивать всё, начиная с генерации. Потому что есть такой RFC 4122, который
специфицирует платформо-зависимый двоичный формат UUID и его преобразование в строку. В
первом посте первая строчка - как раз по этому RFC.

И хотя генерация-то UUID в Firebird этому RFC соответствует (по крайней мере на Windows),
но вот его преобразование - нет. Ни старое, ни новое.

Ещё одна проблема: база-то у нас подразумевается платформо-независимая, а в заголовке у
неё - внезапно! - платформо-зависимый UUID.

И если всё это разруливать, то PR получится опять неприемлемо большим и много чего ломающим.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031525
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

я вчера поднял переписку в FD по этому поводу, и генерация и преобразование должны работать по этому RFC (за исключением возможно регистра). Нюансы обсуждались еще и в трекере, см. CORE-3238. Но в плане преобразования правильно работают только CHAR_TO_UUID и UUID_TO_CHAR. Ты в них заглядывал? Там отнюдь не тупой printf/scanf как в StringToGuid / GuidToString, код несколько сложнее. Вот я и предлагаю его перенести в StringToGuid / GuidToString, выкинув оттуда поддержку legacy-формата.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031572
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrНо в плане преобразования правильно работают только CHAR_TO_UUID и UUID_TO_CHAR. Ты в них
заглядывал?

Заглядывал. evlUuidToChar:
Код: plaintext
1.
2.
3.
4.
5.
sprintf(buffer, GUID_NEW_FORMAT,
USHORT(data[0]), USHORT(data[1]), USHORT(data[2]), USHORT(data[3]), USHORT(data[4]),
USHORT(data[5]), USHORT(data[6]), USHORT(data[7]), USHORT(data[8]), USHORT(data[9]),
USHORT(data[10]), USHORT(data[11]), USHORT(data[12]), USHORT(data[13]), USHORT(data[14]),
USHORT(data[15]));


То есть тупо выводится 128-ми разрядное число в big endian. Это соответствует тому, что
написано на вики, но не RFC. Хотя я не прослеживал всю цепочку. Возможно, байты где-то тасуются уже после того, как их выдал вызов CoCreateGuid() в guid.cpp.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031575
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: Нашёл, они тасуются в evlGenUuid, но все прочие места (включая DB UID) используют
результат GenerateGuid "как есть".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031584
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPS: Хотя вывод и идёт как big endian, GenUuid тасует байты так, что time-часть идёт
первыми байтами, что совсем нехорошо для индексов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031585
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovчто time-часть идёт первыми байтами, что совсем нехорошо для индексов.
я еще в 2006 году писал функцию, которая переворачивает штатный виндовый guid (CreateClassID).
Правда, с тех пор вроде CreateClassID стало возвращать guid в более правильном порядке.
Казалось бы, если у вас 36 "случайных" символов, ну сделайте порядок групп нормально сортируемым, что за проблема...
...
Рейтинг: 0 / 0
Вывод UUID
    #40031591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvПравда, с тех пор вроде CreateClassID стало возвращать guid в более правильном порядке.

Идентификаторы классов это вообще левая вещь, тянущаяся с тёмных веков. Правильные
генераторы это UuidCreateSequential() и UuidCreate().

[quot kdv#22255039Казалось бы, если у вас 36 "случайных" символов, ну сделайте порядок групп нормально сортируемым, что за проблема...[/quot]
Мелкая такая проблема: они вообще не предназначались для сравнений на больше-меньше, только на равенство.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031594
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще не понял, в чем проблема.
Ну выдал не в том порядке - ну и фиг
с ним, все равно два сравнения одним
способом (будь-то строка или байты)
дадут один результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031595
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для GUID-ов наверное можно было бы сделать трюк, похожий на DBKEY - внутри движка он специальный тип, а при передаче наружу превращается в BINARY(16). Тогда в индексе ключ можно генерить по-другому, в частности меняя порядок байт для оптимального сжатия. Тут правда фигня в том, что оный порядок байт есть только на винде, а на линуксе просто поток случайных байт. Да и вообще ХЗ кто этот GUID генерил (ФБ или снаружи) и на какой платформе, так что в общем смысле это выглядит довольно бессмысленной затеей.

Но пока тут речь вообще не про это :)
...
Рейтинг: 0 / 0
Вывод UUID
    #40031601
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТут правда фигня в том, что оный порядок байт есть только на винде, а на линуксе просто
поток случайных байт.

Это сейчас в Firebird реализовано так, а вообще-то есть
https://linux.die.net/man/3/libuuid например...

dimitrв общем смысле это выглядит довольно бессмысленной затеей.

Без специального типа, торчащего наружу - да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031778
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНашёл, они тасуются в evlGenUuid

Да, с перетасовкой вывод соответствует RFC:

MS = {5b2c1ba0-48fc-11eb-8287-2c44fdb89adb}
ODBC = {5B2C1BA0-48FC-11EB-8287-2C44FDB89ADB}
gstat = {1BA05B2C-48FC-11EB-8782-442CB8FDDB9A}
UUID_TO_CHAR = {5B2C1BA0-48FC-11EB-8287-2C44FDB89ADB}

Но менять сейчас эту перетасовку для пущей дружелюбности к индексам, наверное, уже поздно...
...
Рейтинг: 0 / 0
Вывод UUID
    #40031779
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RFC регистр не оговаривает что ли ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод UUID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]