如何使用以下属性生成最多 12 个字符的唯一键:姓名、父亲姓名、母亲姓名、出生日期、出生地点。
提前致谢 :)
唯一标识符的主要且实际上唯一的属性是它是唯一的(在考虑的范围内,可以是表、模式或全局)。将任何“现实世界”值纳入这样的 id 是没有意义的。
如果您确定这些属性唯一地描述了一个人,您应该对您提到的属性创建一个唯一约束。这种属性组合形成了表的“自然键”。
唯一 ID 是一个“代理键”,它是一个方便的句柄,它使您不必在与该表的连接中指定自然键的所有列。如何获得唯一 ID 取决于数据库。例如,在 Oracle 中,您可以将序列与插入触发器结合使用。
自然键上的唯一约束将阻止您两次插入同一个人,但您应该首先检查表以查看该人是否已经存在。如果是这样,请使用从那时起已经分配的 ID。当然,您可以将其组合到一个过程中,在其中给它您的字段,它会返回 ID,隐藏查找它的行为,或者如果它是新的,则创建它,然后返回新的 ID。
即使这些列也可能不足以成为唯一的,并且由于一个人的名字可以改变(婚姻,选择等),我通常不会使用它来生成唯一的密钥。
我通常使用代理,如自动编号/身份/序列或 UUID/GUID,具体取决于要求。
这不是您描述的密钥,而是您要使用的一小段结构化数据,而不是密钥。也许更有帮助:
-- 您是否希望能够从给定的 12 个字符的密钥中恢复这些属性?
或者
- 你会乐意只在给定这些属性的情况下生成一个密钥吗?
如果您需要相同的属性来生成相同的密钥,请将所有属性连接到一个字符串,计算SHA1
哈希并修剪第一位96
。
这不能保证是唯一的,但50%
哈希冲突的概率将是3.3E+14
绰绰有余的值。
如果您不需要这个,只需使用 surrogate ID
。
嗯..哪个DBMS?
无论如何,将上述字符串与 UUID MySQL 函数的结果连接起来,并对结果执行 CRC32 函数。
然后,减去前 12 个字符。