我正在开发一个系统,该系统大量使用假名来为研究人员提供隐私关键数据。这些假名应具有以下属性:
我的第一个想法是使用UUID4。它们在(1)和(2)上相当不错,但在(3)中却没有那么多。
一种变体是使用更宽的字母表对UUID进行编码,从而产生更短的字符串(例如参见shortuuid)。但我不确定这是否真的提高了可读性。
我目前正在研究的另一种方法是2005年的一篇名为"An optimal code for patient identifiers"的论文,旨在解决我的问题。这里描述的算法创建了具有30位熵的8字符假名。我宁愿使用更广泛审查的标准。
然后还有git方法:只显示实际假名的前几个字符。但这意味着化名可能在一段时间后失去其独特性。
所以我的问题是:人类可读的独特ID是否有任何广泛使用的标准?
不知道任何广泛使用的标准。这是一个非广泛使用的:
Proquints
https://arxiv.org/html/0901.4016
https://github.com/dsw/proquint
UUID4(128位)将转换为8个proquints。如果这太多了,你可以取UUID4的最后64位(=只取64个随机位)。这并不会让它神奇地失去独特性;只会增加碰撞的可能性,一开始就不为零,你可以用数学方法估算它是否仍然可以用于你的目的。
This article建议使用SHA-256哈希中的前几个字符,类似于git所做的。 UUID通常基于SHA-1,因此并非完全不同。属性(2)和(3)之间的权衡是字符数。
由于d
是数字的位数,你总共得到2 ** (4 * d)
标识符,但第一次碰撞预计会在2 ** (2 * d)
之后发生。
最大的问题不在于您使用的标识符类型,而是您处理冲突的方式。