【发布时间】:2014-12-10 10:02:42
【问题描述】:
我的 SQLDB 中有一个主键为 BIGINT(64 位) 现在由于 C# 没有直接生成 64 位密钥的机制,我使用以下代码生成密钥。我的问题是我在我的键列中看到随机但聚集的值。
tl.ID = (this.r.Next() << 32) | this.r.Next();
其中 tl.ID 是一个 LINQ to SQL 类并且是一个 LONG。 this.r 是随机的实例
Random r = new Random((int)DateTime.Now.Ticks);
在 DB 中看到的一些值:
MAX:2147483647
Top few values:
2147478265
2147478479
2147478526
2147479034
2147479663
2147480695
2147480783
2147480887
2147480984
2147481817
2147482099
2147482607
2147483321
2147483391
2147483558
2147483644
2147483647
【问题讨论】:
-
为什么不对数据库中的主键启用自动增量?
-
我认为一旦创建了数据库就不可能了。
-
不是重复的,因为我使用的是帖子中提到的相同技术。创建一个项目并移动 32 位。我的问题是这些生成的值中的大多数都非常接近。某些演员表有问题吗?
-
@confusednerd,您可以在事后使字段成为身份,您只需确保您的初始种子高于现有的最高值。也不知道为什么你认为一个键需要是随机的,它只需要是唯一的,如果它是连续的,那么你的索引会表现得更好。
-
@confusednerd 为了避免有符号无符号问题,生成 4 个 16 位整数而不是 2 个 32 位整数可能是值得的。但是在这一点上,解决方案失去了它的优雅,所以我认为最好坚持使用 Random.NextBytes 版本 [...] 它在价值分布方面看起来相当不错(从我运行的非常简单的测试来看)