在这个答案中,解释了多种生成DICOM UID的算法及其缺点。
根据DICOM规格说明,包括问题中的SOPInstanceUID在内的所有UID都应该是唯一的。这与您正在处理的数据(如门控PET数据或其他数据)无关。
以下是规范内容:
2017a Part 5 - 数据结构和编码 (9 Unique Identifiers (UIDs))
唯一标识符(UID)提供了唯一标识各种项目的能力。它们保证了在 DICOM 宇宙中跨多个国家、站点、供应商和设备的唯一性。不考虑任何语义上下文,可以区分不同类别的对象、对象实例和信息实体。
UID由两部分组成:
机构根:
UID的此部分确保了跨机构的唯一性。有些服务提供商免费提供此项服务。我知道的一个是Medical Connections,您可以通过联系他们获得免费的UID。
后缀:
此外,您应该以一种能够确保在您的机构内唯一性的方式生成后缀。
以下是DICOM UID的一般规则:
- 总长度必须<=64个字符,包括停止符
- 只能包含数字0-9和句点
- 每个数字“组件”(在停止符之间)必须是一个有效且明确的整数,因此不能有前导零(除非整个组件为零)
- 必须保证唯一性 - 这意味着:
- 它必须来自您独有控制的正确官方根。
- 不能通过向某人的 UID 添加数字(无论您认为这种组合多么特殊!)来创建它。
- 特别地,不得将二次捕获图像、KIN 对象等系列 UID 创建为 Study UID 的派生物(除非您拥有该根!)
- 与上述相关,对于图像的 Study UID、Series UID 和 Instance UID 没有期望或要求应由相同的根派生(尽管在实践中,Series UID 和 Instance UID 通常是,因为两者都必须由生成图像的设备内部生成)
- 日期和时间对于生成 UID 很有用,但前提是:
- 每台机器都有一个唯一的根(通常是您公司的 UID 根+一个机器特定的后缀,例如序列号)
- 如果可以生成超过1个 UID 每秒,则还应使用顺序计数器
- 如果在多线程机器上,则需要线程 ID 或适当的互锁计数器,以防止两个应用程序或同一应用程序中的两个线程同时生成相同的 UID。
- 不要仅使用时间 - 很容易以前导零0结束 - 例如,20060724.093017 反而应使用 20060724093017
在规范中可以找到类似内容。
以下示例来自 DICOM 规范,用于生成 UID。请注意,这是一个说明性部分。
2017a 部分 5 - 数据结构和编码 (B 创建私有定义的唯一标识符(说明性))
B.1 组织派生的UID:
以下示例展示了一个特定组织为保证SOP实例UID的唯一性而做出的后缀选择。
"1.2.840.xxxxx.3.152.235.2.12.187636473"
在此示例中,根是:
- 1 表示ISO
- 2 表示ANSI成员机构
- 840 表示特定成员机构的国家代码(对于ANSI为美国)
- xxxxx 表示特定组织的标识符(由ANSI分配)
在此示例中,后缀的前两个组成部分与设备的识别有关:
- 3 制造商定义的设备类型
- 152 制造商定义的序列号
后缀的其余四个组成部分与图像的识别有关:
- 235 研究编号
- 2 系列编号
- 12 图像编号
- 187636473 编码的图像获取日期和时间戳
在此示例中,组织选择这些组成部分来保证唯一性。其他组织可能会选择完全不同的系列组件来唯一识别其图像。例如,如果时间戳具有足够的精度以确保没有两个图像可能具有相同的日期和时间戳,则省略研究编号、系列编号和图像编号可能是完全有效的。由于DICOM标准允许创建组织派生UID时具有灵活性,因此实现不应依赖于假定的UID结构,并且不应尝试解析UID以提取其中某些组件的语义。
规范中还提到了一种方法
2017年版第5部分 - 数据结构和编码(B创建私有定义唯一标识符(信息))
B.2 UUID派生UID:
UID可以由根节点“2.25.”后跟一个通用唯一标识符(UUID)的十进制表示构造。该十进制表示将128位UUID视为整数,因此最多可长达39位数字(前导零必须被抑制)。
UUID派生的UID可能适用于动态创建的UID,例如SOP实例UID,但通常不适用于应用软件设计期间确定的UID,例如私有SOP类或传输语法UID或实现类UID。