Создание детерминированного UID в зависимости от MAC-адреса и имени пользователя.

Я пишу процедуру Python для создания файлов DICOM. В этом случае мне нужно указать тег UID создателя экземпляра, который используется для уникальной идентификации устройства, создавшего файл DICOM. Поэтому мне нужна функция, которая генерирует такой UID для данной машины и конкретного пользователя, который запустил процедуру создания DICOM.

Я предполагаю, что UUID может быть создан из MAC-адреса и имени пользователя. Однако UID, созданный с помощью модуля uuid в python, является случайным, поэтому UID отличается каждый раз, когда вызывается подпрограмма.

Есть ли способ сгенерировать детерминированный UID, который будет зависеть от MAC-адреса и имени пользователя?


person BayesianMonk    schedule 10.03.2020    source источник
comment
См. это и это ответы. В них обсуждаются правила при создании DICOM UID и несколько алгоритмов для их создания.   -  person Amit Joshi    schedule 10.03.2020


Ответы (1)


UUID3 и 5 являются uuid на основе имени, поэтому они не будут изменяться случайным образом (по компоненту времени).

import uuid
import getpass

username = getpass.getuser(). # Username
node = hex(uuid.getnode())  # MAC address

urn = 'urn:node:%s:user:%s' % (node, username)

for i in range(3):
    print (uuid.uuid3(uuid.NAMESPACE_DNS, urn))

Выход:

4b3be55c-c6d9-3252-8b61-b16700fa6528
4b3be55c-c6d9-3252-8b61-b16700fa6528
4b3be55c-c6d9-3252-8b61-b16700fa6528

Для получения дополнительной информации посетите страницу https://pymotw.com/3/uuid/.

person Maurice Meyer    schedule 10.03.2020
comment
Хотя это верно, это не очень помогает с идентификаторами DICOM — они имеют другой формат и также должны начинаться с префикса конкретного поставщика. Вероятно, вы могли бы использовать хэш-значение MAC-адреса и имени пользователя для генерации UID. - person MrBean Bremen; 10.03.2020
comment
Хотя, с другой стороны, вы можете перевести этот вывод в десятичные числа, преобразовать его в правильный формат и добавить префикс. Если полученный UID не слишком длинный, это хорошее решение. - person MrBean Bremen; 10.03.2020
comment
@MrBeanBremen: вот как передать/преобразовать его в UID DICOM с помощью C#. Нужно перевести на python. - person Amit Joshi; 10.03.2020
comment
@AmitJoshi, здорово! Должно быть легко преобразовать это в Python. - person MrBean Bremen; 10.03.2020
comment
@MrBeanBremen: это действительно то, что я делаю, я добавляю сгенерированный UID к префиксу конкретного поставщика, например: f"1.3.6.1.4.1.32839.1{uuid.uuid3(uuid.NAMESPACE_DNS, urn).int:039}" - person BayesianMonk; 10.03.2020