Если вы внимательно прочитали главу о формате и строковом представлении UUID, как это определено DCE, то вы не сможете наивно рассматривать строку UUID как шестнадцатеричную строку, см. Строковое представление UUID ( ссылается из Microsoft Developer Network ).
То есть потому что первые три поля представлены в формате с прямым порядком байтов (сначала самая значимая цифра).
Таким образом, наиболее точный (и, вероятно, самый быстрый) способ в системе с прямым порядком байтов, работающей на PHP 32bit:
$bin = call_user_func_array('pack',
array_merge(array('VvvCCC6'),
array_map('hexdec',
array(substr($uuid, 0, 8),
substr($uuid, 9, 4), substr($uuid, 14, 4),
substr($uuid, 19, 2), substr($uuid, 21, 2))),
array_map('hexdec',
str_split(substr($uuid, 24, 12), 2))));
Он разбивает строку на поля, превращает шестнадцатеричное представление в десятичные числа и затем перетаскивает их через pack
.
Поскольку у меня нет доступа к архитектуре с прямым порядком байтов, я не смог проверить, работает ли это или нужно использовать, например, различные спецификаторы формата для pack
.