Database 预生成Guid并将其作为主键插入表中有多安全?

Database 预生成Guid并将其作为主键插入表中有多安全?,database,language-agnostic,Database,Language Agnostic,我以前见过很多情况,PK是没有默认值的Guid,因此开发人员会生成随机Guid并使用它们插入数据库 我经常想知道他们生成一个已经存在的数字的可能性是什么?一些信息:16字节可以容纳的值的数量是2^128 Total=可以表示的总值的数目 实际值=已使用的值数 将ID插入到已存在的表中的概率可以表示为: 1-(总计-实际)/总计 我做了一些初步计算,得出了以下结论: 假设你有一个表,表中已经有1000万条记录,那么概率是 1-(2^128-10000000)/2^128 这是恰当的 0.00000

我以前见过很多情况,PK是没有默认值的Guid,因此开发人员会生成随机Guid并使用它们插入数据库


我经常想知道他们生成一个已经存在的数字的可能性是什么?

一些信息:16字节可以容纳的值的数量是2^128

Total=可以表示的总值的数目

实际值=已使用的值数

将ID插入到已存在的表中的概率可以表示为:

1-(总计-实际)/总计

我做了一些初步计算,得出了以下结论:

假设你有一个表,表中已经有1000万条记录,那么概率是

1-(2^128-10000000)/2^128

这是恰当的

0.00000000000000000000000003

我想现在我知道为什么会这样说了:

虽然不能保证生成的每个GUID都是唯一的,但唯一密钥的总数非常大,因此生成两次相同数目的概率非常小


一些信息:16字节可容纳的值数为2^128

Total=可以表示的总值的数目

实际值=已使用的值数

将ID插入到已存在的表中的概率可以表示为:

1-(总计-实际)/总计

我做了一些初步计算,得出了以下结论:

假设你有一个表,表中已经有1000万条记录,那么概率是

1-(2^128-10000000)/2^128

这是恰当的

0.00000000000000000000000003

我想现在我知道为什么会这样说了:

虽然不能保证生成的每个GUID都是唯一的,但唯一密钥的总数非常大,因此生成两次相同数目的概率非常小


在大多数情况下,这对我来说足够安全。你指的是16字节,而不是16位。还应注意,一些GUID生成方案包括时间/日期和/或以太网mac地址信息。这些方案有坏的影响(你可以使用GUID来跟踪生成器,GUID变得更可预测),也有好的影响(因为mac地址是唯一的,时间/日期总是向前移动,你甚至没有机会多个源生成相同的GUID)。@Michael谢谢你的帮助,我完全错过了这一点。Edited。@Michael是的,我知道有些生成方案被认为是可预测的,但在本例中,我只是说唯一性因素,而不是说是否有人可以确定或预测数据库的未来值。在大多数情况下,这对我来说足够安全。你是说16字节,不是16位。还应注意,某些GUID生成方案包括时间/日期和/或以太网mac地址信息。这些方案有坏的影响(你可以使用GUID来跟踪生成器,GUID变得更可预测),也有好的影响(因为mac地址是唯一的,时间/日期总是向前移动,你甚至没有机会多个源生成相同的GUID)。@Michael谢谢你的帮助,我完全错过了这一点。编辑。@Michael是的,我知道有些生成方案被认为是可预测的,但在本例中,我所说的纯粹是唯一性因素,而不是某人是否能够确定或预测数据库的未来值。