Я часто встречаю эти две аббревиатуры, и интересно, в чём же их отличия?
Ответ Простой ответ: разницы нет, они обозначают одно и то же. Для большинства практических целей можно рассматривать их как 16-байтные (128-битные) значения, которые призваны быть уникальными. В Microsoft их называют GUID, в то время как все остальные называют UUID. И авторы спецификации UUID, и сам Microsoft в настоящее время считают их синонимами: в RFC 4122 указанно, что UUID «also known as GUIDs (Globally Unique IDentifier)» в ITU-T Recommendation X.667, ISO/IEC 9834-8:2004 International Standard: «UUIDs are also known as Globally Unique Identifiers (GUIDs), but this term is not used in this Recommendation» и даже Microsoft в своей документации указывает: «In Microsoft Windows programming and in Windows operating systems, a globally unique identifier (GUID), as specified in RFC4122, is ... The term universally unique identifier (UUID) is sometimes used in Windows protocol specifications as a synonym for GUID».
Подробный ответ Однако по-настоящему правильный ответ зависит от того, что именно в вопросе имеется в виду под термином «UUID». Первая часть зависит от того, о чём спрашивающий думает, когда говорит «UUID». Из документации Microsoft неявно следует, что все UUID являются корректными GUID. Однако при этом остаётся неочевидным: любой ли GUID является корректным UUID? Другими словами, является ли UUID всего лишь подмножеством GUID, или это одно и то же множество? В RFC 4122 мы можем обнаружить четыре разных варианта («variants») UUID. Так получилось из-за того, что подобные 16-байтные идентификаторы использовались и до того, как появилась спецификация UUID. В спецификации эти варианты постарались объединить. Согласно разделу 4.1.1, варианты таковы: вариант 0 (0xxx) — зарезервирован для совместимости с устаревшим Apollo Network Computing System вариант 1 (10xx) — основной, который и описан в RFC 4122 (имеет пять подвариантов, называемых «версиями») вариант 2 (110x) — зарезервирован для обратной совместимости с системами Microsoft вариант 3 (111x) — зарезервирован на будущее.
Согласно RFC 4122 все варианты UUID являются «настоящими UUID», так что все GUID также являются UUID. Если отвечать буквально на вопрос «в чём разница между UUID и GUID», то, согласно RFC, ответ — разницы нет (но с учётом написанного ниже). Но не все GUID являются UUID варианта 1 (например, Microsoft COM имеет GUID, которые являются UUID варианта 2). Если отвечать на вопрос «есть ли разница между GUID и UUID варианта 1», то ответ был бы да — они могут быть разными. Кто-нибудь, задающий вопрос про UUID и GUID, вероятно, не в курсе о существовании вариантов, и они, говоря «UUID», неявно подразумевают только UUID варианта 1 (например, они что-то слышали про UUID с MAC-адресом+временем и про случайные UUID, которые оба являются версиями варианта 1). В этом случае ответ — да, разница есть. Так что ответ зависит от того, что имеет в виду спрашивающий, когда говорит «UUID». Имеет ли он в виду UUID варианта 1 или вообще любые UUID? Вторая часть зависит от того, какая спецификация используется в качестве определения UUID. Заглянем в ITU-T X.667 ISO/IEC 9834-8:2004, который должен быть полностью совместим с RFC 4122. В пункте 11.2 есть дополнительное предложение, в котором говорится (перевод): «Все UUID, соответствующие настоящей Рекомендации | Международному стандарту, должны иметь variant-биты с битом 7 октета 7, установленным в 1, и битом 6 октета 7, установленным в 0». В переводе на человеческий язык это означает, что только UUID варианта 1 (10xx) соответствуют этому стандарту. В таком случае не все GUID являются UUID в понимании ITU-T/ISO/IEC. Таким образом, реальный ответ зависит и от того, какую именно спецификацию UUID подразумевает вопрос. Если мы говорим о любых UUID, а не только об UUID варианта 1, получается так: нет разницы между GUID и IETF UUID (RFC 4122), однако есть разница между GUID и ITU-T/ISO/IEC UUID! Практические замечания В приведённой выше информации не рассматриваются детали значений UUID/GUID и способы их создания. Однако есть два неверных представления об этих значениях, которые нужно прояснить. 1. Представление UUID/GUID Во-первых, одно и то же значение UUID/GUID можно записать разными способами. В памяти или хранилище оно может компактно храниться в бинарном виде. Например, оно может быть представлено как массив из шестнадцати байт, как восемь 16-битных слов или как четыре 32-битных числа (знаковых или беззнаковых). При этом в двух последних случаях имеет значение порядок байт (little endian или big endian). В текстах часто используется такой формат: hhhhhhhh-hhhh-Yhhh-Xhhh-hhhhhhhhhhhh где h, X и Y — шестнадцатеричные цифры. Программы могут обрабатывать текстовый формат по-разному. Некоторые принимают только прописные или только строчные символы (хотя по стандарту регистр не имеет значения). Некоторые требуют отсутствия дефисов или их наличия в строго определённых местах (хотя дефисы тоже не должны ни на что влиять). Изначально дефисы использовались в версии UUID, содержащей время, для визуального разделения времени, счётчика и MAC-адреса. Разумеется, такое разделение не имеет смысла для других версий UUID, но по традиции эти дефисы используются до сих пор. 2. Интерпретация байтов Во-вторых, всегда используйте библиотеку для генерации UUID/GUID. Если просто взять 16 случайных байт, то не факт, что из них получится корректный UUID/GUID. Даже в UUID версии 4 некоторые байты должны иметь определённые значения. В приведённом выше текстовом формате три бита в цифре X кодируют вариант UUID. Для варианта 1 (который описан в RFC 4122) X будет 8, 9, A или B. Для UUID варианта 1 биты в цифре Y кодируют его версию. Например, 4 означает версию 4. Случайные 16 байт не гарантируют, что эти байты будут содержать правильные значения в этих двух цифрах. Подробнее можно почитать в RFC 4122. Но обычно вам не нужно разбираться во внутренней структуре UUID. Если вы получаете готовые значения, просто рассматривайте их как 16-байтные (128-битные) значения, используемые в качестве уникального идентификатора.
Слегка вольный перевод ответа от Hoylen на enSO с дополнениями от сообщества. Нумерация вариантов UUID в RFC не определена, и в этом ответе варианты пронумерованы в соответствии с числом ненулевых бит в обозначении варианта (как в Википедии).