生成 C# 长唯一 ID

Posted

技术标签:

【中文标题】生成 C# 长唯一 ID【英文标题】:Generate C# Long Unique ID 【发布时间】:2009-06-23 10:49:29 【问题描述】:

我有一个 SQL 数据库,其中包含一组具有唯一 ID 的表。很长一段时间以来,我一直在使用唯一标识符数据类型并从我的 C# 接口传入一个 guid。但是为了查询时的速度,我决定改用 bigint 并传入 long。

每次我运行代码时创建唯一 long 以确保 ID 不重复的最简单方法是什么?

【问题讨论】:

【参考方案1】:

您可以保证 bigint 在数据库表中唯一的唯一方法是让 SQL Server 为您生成它 - 使其成为 IDENTITY 列。

您是否真的使用 uniqueidentifier 测量性能并发现它太慢了?

【讨论】:

不,但是存储 ID 值为 3h38d9383-3j394juj93-3jd309d 等的字段肯定会比简单地使用从 1 递增到 1000000 等的单个整数慢得多。 我们过去发现,即使是相对少量的数据(如 50 到 100k 条记录),它也可能非常缓慢。 @Goober:Guid 也是一个整数,只是更大。 它是一个可以转换为数字的字符串。对于 sql server 上的比较,它不算作数字。 @Kevin:我相信你在你的数据库中找到了这个。我想知道 Goober 是否在他的数据库中找到了它,他的负载,或者他是否在推测。【参考方案2】:

如果速度是一个问题,如果使用 uniqueidentifier,您可以通过使用 newsequantialID() 函数而不是 newID() 生成它来改进查询。新方法生成顺序唯一标识符

【讨论】:

【参考方案3】:

除了种子之外,还有其他选项可以生成唯一编号。一种可能性是根据时间生成一个数字,例如滴答声,或者更好地计算自 2009 年初以来的秒数。然后根据位置(或帐户,如果您不在服务器上执行此操作,则附加一个唯一数字) ) 数字被创建到数字的末尾(最低有效数字)。

因此,如果您的新唯一编号是在 app 服务器 1 上创建的,并且它的 id 是 42,并且自 2009 年初以来已经过了 4000 秒,那么您的新标识符将是 400042。下一个生成的可能是 400942,而在同一时间从不同服务器生成的可能是 400943。

【讨论】:

【参考方案4】:

您认为减速在哪里?查询还是插入/更新?我问是因为 GUID 作为主键不适合插入/更新,因为它们不像 IDENTITY 那样是连续的,并且可能导致键的聚集索引出现一些抖动。但是 SQLServer 现在有顺序指南可以解决这个问题。我听说很多关于使用 GUID 作为键的速度很慢,但我想知道这在多大程度上是真的。尤其是在 64 位机器上 - 比较 128 位数字真的比比较 64 甚至 32 位数字慢很多吗?

【讨论】:

以上是关于生成 C# 长唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

C#生成唯一的ID保存到数据库

从存储在 MYSQL 中的 C# 生成唯一 ID

浅谈全局唯一ID的生成方案

分布式唯一ID生成器Twitter

在 Windows 10 商店应用程序 c# 中获取设备的唯一 ID

生成随机的唯一值 C#