GUID - что и как?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

GUID - что и как?

Сообщение Diamock » 07.06.2012 (Чт) 16:23

Здравствуйте Уважаемые!
Любой GUID уникален во времени и пространстве. Он включает в себя время (60 бит — число 100-наносекундных интервалов, прошедших с 00:00:00:00 15 октября 1582 года) и адрес сетевой платы (48 бит).
Цитата из прочитанной мной статьи.

Код: Выделить всё
Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
End Type
Объявление GUID в VB.

Размер Data1 — 4 байта или 32 бита;
Размер Data2 — 2 байта или 16 бит;
Размер Data3 — 2 байта или 16 бит;
Размер Data4 — 8 байт или 64 бита.
Итого 128 бит или 16 байт.

Из цитаты простым сложением получаем — 108 бит. 20 бит не хватает. Это опечатка или так и есть?
Как по полям GUID — распределяются наносекурдные интервалы и адрес сетевой платы?
И дополнение к первому вопросу: если не опечатка для чего оставшиеся 20 бит и в каком поле они пустуют?
Ну и последний вопрос, почему именно 15 октября 1582 года?
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GUID - что и как?

Сообщение Хакер » 07.06.2012 (Чт) 16:49

Цитату к черту. GUID — это просто с высокой долей вероятности уникальное число.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: GUID - что и как?

Сообщение FireFenix » 07.06.2012 (Чт) 18:14

Кэп Очевидность писал(а):GUID

Diamock писал(а):И дополнение к первому вопросу: если не опечатка для чего оставшиеся 20 бит и в каком поле они пустуют?
Ну и последний вопрос, почему именно 15 октября 1582 года?

Наверное потому, что
15 октября 1582г — папа Григорий XIII ввёл григорианский календарь.
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 02.08.2012 (Чт) 12:30

Diamock писал(а):108 бит. 20 бит не хватает

Это ещё цветочки. Переменная типа Boolean использует то всего 1 bit, а занимает целых 16!! Гражданин Гейтс - Вы пошто так транжирите народные биты?!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GUID - что и как?

Сообщение Хакер » 02.08.2012 (Чт) 12:33

ark писал(а):Это ещё цветочки. Переменная типа Boolean использует то всего 1 bit, а занимает целых 16!!

Переменная типа Boolean использует все 16 битов. True = 1111111111111111b, а не 0000000000000001b.
О причине такого хода подумай сам.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 02.08.2012 (Чт) 12:39

Использует для ХРАНЕНИЯ результата, а не для самого флага - для флага достаточно 1 бита. Я к тому, что интересно было бы посмотреть, как Винда хранит именно 60 бит.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GUID - что и как?

Сообщение Хакер » 02.08.2012 (Чт) 13:21

ark писал(а):Использует для ХРАНЕНИЯ результата, а не для самого флага - для флага достаточно 1 бита.

1 бита достаточно только по-твоему мнению. Одного бита достаточно в соответствии с теорией информации.

Одного бита недостаточно в соответствии с практикой.
У создателей VB была возможность сделать Boolean-переменными упаковываемыми в 1 бит, и группировать пачки из 8 таких переменных в блоки по одному байту. У них был выбор, сделать так, или не делать так. И они оправданный выбор не делать так, потому что на подобную переменную нельзя было бы сослаться по указателю/адресу. Это значит, ни в API-функцию ни передать такую переменную, ни в свою же функцию через BeRef.

У создателей VB была возможность сделать Boolean-переменную размером 1 байт. И был выбор, сделать её размером 1 байт, 2 байта или 4 байта. Как ты думаешь, почему именно выбрали 2 байтный размер?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GUID - что и как?

Сообщение Mikle » 02.08.2012 (Чт) 14:27

Хакер писал(а):Как ты думаешь, почему именно выбрали 2 байтный размер?

Мне это тоже непонятно. Почему не бит - это ясно, но с точки зрения быстродействия лучше Long, с точки зрения экономии памяти - Byte, с точки зрения совместимости с API (читай с C++) - тоже Long или Byte, ибо:
In Visual C++4.2, the Standard C++ header files contained a typedef that equated bool with int. In Visual C++ 5.0 and later, bool is implemented as a built-in type with a size of 1 byte. That means that for Visual C++ 4.2, a call of sizeof(bool) yields 4, while in Visual C++ 5.0 and later, the same call yields 1. This can cause memory corruption problems if you have defined structure members of type bool in Visual C++ 4.2 and are mixing object files (OBJ) and/or DLLs built with the 4.2 and 5.0 or later compilers.

Остаётся совместимость со старыми, ещё 16-разрядными, бейсиками, но нафиг она нужна, такая совместимость, ведь всё равно утрачена совместимость в гораздо более глобальных вещах.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.08.2012 (Чт) 19:33

Хакер писал(а):Как ты думаешь, почему именно выбрали 2 байтный размер?

Такой же как Integer. Из-за того, что логические операции побитовые. И -1, а не 1 (как в других языках) по той же причине.

Хакер писал(а):У создателей VB была возможность сделать Boolean-переменными упаковываемыми в 1 бит, и группировать пачки из 8 таких переменных в блоки по одному байту.

Этого требует стандарт для vector<bool> в Си++ :)

Хакер писал(а):У создателей VB была возможность сделать Boolean-переменную размером 1 байт.

А почему бы не сделать именно так, а при использовании операторов подставлять интовую -1?

PS: А как MS SQL Server упаковывает столбцы типа bit по 8 штук в байт, если каждый из них может принимать 3 значения?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: GUID - что и как?

Сообщение iGrok » 02.08.2012 (Чт) 23:11

Mikle, Qwertiy. Насколько я помню, пока всё мимо. Впрочем, и вопрос не вам задавали. :)
label:
cli
jmp label

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 03.08.2012 (Пт) 1:33

Хакер писал(а):Как ты думаешь, почему именно выбрали 2 байтный размер?

Потому что
1. TRUE = NOT FALSE
2. Если бы выбрали 1 байт, то TRUE было бы 255, учитывая отсутствие знаковых байтов в Васике, что как-то кривовато
3. Если бы Билли уговорил производителей квантовать память битам, то так бы и было - True=1b, False=0b, GUID по длинне - 108 бит

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GUID - что и как?

Сообщение Хакер » 03.08.2012 (Пт) 7:09

ark писал(а):3. Если бы Билли уговорил производителей квантовать память битам, то так бы и было - True=1b, False=0b, GUID по длинне - 108 бит

Какой бред...

Особенно мне нравится апелляция к Билли...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.08.2012 (Пт) 7:39

Mikle писал(а):Byte, с точки зрения совместимости с API (читай с C++)

Там всё равно конвертирование нужно :)

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 03.08.2012 (Пт) 8:11

Хакер писал(а):Какой бред...
Особенно мне нравится апелляция к Билли...

Сам бред
Ну не Билли, так Алан Купер, или кто там boolean в VB добавил. Если бы у проца было не 8 регистров по 32 бита а 256 по 1 - ну и были бы битовые типы. А насчет совместимости с АПИ - BOOL там знаковая int32

ЗЫ: А вообще-то вопрос был - почему GUID занимает 128 битов вместо 108. Я и ответил - по той же причине, что в ВБ Boolean занимает 16 вместо 1. Нет?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: GUID - что и как?

Сообщение Mikle » 03.08.2012 (Пт) 8:19

ark писал(а):Потому что
1. TRUE = NOT FALSE

И как это относится к размеру 2 байта? Это ответ на вопрос, почему False=-1, но не почему Len(A As Boolean)=2.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 03.08.2012 (Пт) 8:23

Mikle писал(а):И как это относится к размеру 2 байта

Это относится к
Хакер писал(а):True = 1111111111111111b, а не 0000000000000001b

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: GUID - что и как?

Сообщение Хакер » 03.08.2012 (Пт) 8:47

ark писал(а):ЗЫ: А вообще-то вопрос был - почему GUID занимает 128 битов вместо 108. Я и ответил - по той же причине, что в ВБ Boolean занимает 16 вместо 1. Нет?

Глупость.
GUID — по определению 128-битный идентификатор. Хоть пусть байт будет 7-битным или 9-битным на какой-то фантастической архитектуре. GUID будет и останется 128-битным идентификатором. Потому что именно таким его придумали именно такое определение ему дали. Откуда взялись 108, ума не приложу. Это даже не степень двойки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 03.08.2012 (Пт) 9:12

Хакер писал(а):GUID — по определению 128-битный идентификатор
Ну так и я о том же! Bollean по определению - 16 битный тип, хотя фактически, с точки зрения экономии, МОГ БЫ быть 1-битным. А 108 взялось у ТС, со статьи, ссылку на которую он не выложил. Причем это способ получения GUID V1 от MS. Пришлось лезть в Вики - кстати, нашлось еще 4 бита - у data3 4 старших бита отвечаю за версию: 0001(1) для V1, 0100(4) для V4.
108+4=112
128-112=16 - это уже радует :D 2 оставшихся байта - наверняка зашифрованная сигнатура типа BG или MS :D

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 03.08.2012 (Пт) 9:57

Хакер писал(а):Потому что именно таким его придумали именно такое определение ему дали.

В DES ключ 64-битный, а на самом деле, 56. Так что почему бы и нет? Собственно, об этом и спрашивалось изначально - что в остальных битах и где они.

Mikle писал(а):И как это относится к размеру 2 байта? Это ответ на вопрос, почему False=-1, но не почему Len(A As Boolean)=2.

Чтобы что-то типа
Код: Выделить всё
Dim A As Integer
Dim B As Boolean

A = 256
B = True

If A And B Then MsgBox("Yes!!!")
работало.

ark писал(а):А насчет совместимости с АПИ - BOOL там знаковая int32

Почему именно знаковая? Там важно только 0 в ней или нет.
Любой параметр меньшего размера помещается в стек как 4 байта. Если говорить про 32х-битную архитектуру. (Если не ошибаюсь, почему-то мысли про 2 ещё в голову приходят.)

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 03.08.2012 (Пт) 10:13

Qwertiy писал(а):Почему именно знаковая

This type is declared in WinDef.h as follows:
typedef int BOOL;

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: GUID - что и как?

Сообщение ger_kar » 14.08.2012 (Вт) 19:07

Интересная тема, но почему-то обрывается не закончившись. Версий много, особенно про то, почему Boolean имеет размер 2 байта, но какая из них верная так и осталось непонятно. Хочу внести и свои пять копеек и высказать свое предположение. По моей версии дело было так...
Если для 32-Битных процессоров родной размер 32 бита, то для старых 16-битных родным был совершенно другой размер, и когда рождался этот тип то для него задействовали 16 бит, как самый родной :), да так и оставили.
Mikle писал(а):Остаётся совместимость со старыми, ещё 16-разрядными, бейсиками, но нафиг она нужна, такая совместимость, ведь всё равно утрачена совместимость в гораздо более глобальных вещах.
Я думаю, что заморочка была не в том, чтобы сохранить совместимость, а просто не стали заморачиваться и переделывать, да и оставили все как есть.

А вообще очень бы хотелось узнать версию Хакера, а может и не просто версию, а точные факты, если таковые вообще известны :)
Бороться и искать, найти и перепрятать

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: GUID - что и как?

Сообщение iGrok » 14.08.2012 (Вт) 23:54

Моя версия - потому что typedef short VARIANT_BOOL;.
label:
cli
jmp label

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.08.2012 (Ср) 0:15

iGrok писал(а):Моя версия - потому что typedef short VARIANT_BOOL;.

Это что? И откуда?

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: GUID - что и как?

Сообщение VBTerminator » 21.08.2012 (Вт) 20:58

Qwertiy писал(а):Это что?

Выдержка из спецификации COM, которой придерживается VB для работы с COM-библиотеками и контролами.

Код: Выделить всё
typedef short VARIANT_BOOL
на языке Си означает, что булевые переменные являются знаковыми двубайтовыми числами.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.08.2012 (Ср) 13:28

VBTerminator писал(а):на языке Си означает, что булевые переменные являются знаковыми двубайтовыми числами.

Это я знаю :)

VBTerminator писал(а):Выдержка из спецификации COM, которой придерживается VB для работы с COM-библиотеками и контролами.

Так вопрос был "почему", а не в какой спецификации это написано...

Хакер, так ты правильный ответ-то скажешь?

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 09.09.2012 (Вс) 12:37

Qwertiy писал(а):Почему именно знаковая? Там важно только 0 в ней или нет.
Сорри за повторную цитату, случайно обратил внимание http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspxОказывается, у MS BOOL таки может принимать 3 (три!) значения :)
Т.е. non-zero и -1 это разные вещи для BOOL :o Нет, почему так получается - понятно, но по терминологии - если BOOL - так true/false, если нет - так оставьте int или добавьте какой-нибудь TRISTATE_BOOL
ЗЫ: По поводу терминологии мне ещё нравится IF (S_FALSE == TRUE) :D

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 09.09.2012 (Вс) 14:24

Потому что на самом деле такие функции возвращают int...

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: GUID - что и как?

Сообщение ark » 10.09.2012 (Пн) 6:56

Qwertiy писал(а):Потому что на самом деле такие функции возвращают int
На самомо деле такие функции из Win32 в основном возвращают еах, т.е. 32 бита. А уж во что кастовать - дело вкуса. Хоть в int, хоть в int32_t, хоть в DWORD, а хочешь - в HALF_QWORD/HALF_FILETIME/MS_SUPER_BOOL через объявление в хедере. У MS вкус таков, что кастуют в BOOL, которая по их же спецификации может принимать только 2 значения TRUE/FALSE, но в этой функции (и подобных), в порядке исключения, - больше.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 71

    TopList