2010-06-21 40 views
1

如何实现一种在asp.net应用程序中为用户创建和分配ID的方法的最佳方式是什么?创建通用用户标识的最佳实践

我想使用的DateTime蜱和线程ID

我想确保没有任何碰撞和用户ID是唯一的。

ID可以是一个字符串或长。

我应该使用MD5关于我从用户收集的一些信息吗?那会是什么?

我看到md5的碰撞率非常低。

+0

是否存在任何安全问题 - ID是否应该难以猜测? 是否有任何性能问题?使用GUID的 – Mashmagar 2010-06-21 19:41:00

回答

3

最简单的解决方案是自动增量号码。这需要一个中央服务器。

日期/时间加单向散列用于伪随机ID。他们必须伪随机安全吗?这不应该依赖于唯一性,因为根据定义,单向哈希会相互冲突。在发布ID之前,您仍然需要中央服务器来检查重复项。

如果ID是在分布式系统中创建的(没有中央服务器来生成ID),GUID是最好的。 GUID可以在不同的机器上生成,它们不应该相互冲突。取决于实施,但一些GUID算法只是伪随机的,是的,仍然存在碰撞的可能性。

7

我会根据您提供的有限信息使用GUID。

+0

保证唯一性? – DarthVader 2010-06-21 18:45:35

+2

GUID并非总是最适合ID,特别是如果它们是数据库中的主键,但考虑到原始问题的措辞,我必须同意。 – Randolpho 2010-06-21 18:45:41

+0

是的。根据http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx“新Guid的值将全部为零或等于任何其他Guid的可能性非常低。” – Reddog 2010-06-21 18:45:50

1

Guid是迄今为止用于生成用户标识的唯一ID的最佳选择。他们绝对保证是unique globally(因此名称)。为了最好地使用聚集索引,你应该使用NEWSEQUENTIALID()。这会生成可以附加到索引的顺序标识符,并防止每次添加值时SQL Server必须重新组织和分页索引。使用这个函数有一个小的安全问题,因为可以确定序列中的下一个值。

+0

GUID不是“绝对保证”是全球唯一的。微软表示,他们的实施“被复制的可能性非常低”。 http://msdn.microsoft.com/en-us/library/system.guid.aspx – 2010-06-21 22:15:07

+0

微软还表示它们是全球唯一的:http://msdn.microsoft.com/en-us/library/ms190215(SQL。 90).aspx “世界上没有其他计算机会生成该GUID值的副本。” ...但是我们正在谈论不同的事情。你指的是.NET实现,我指的是Sql Server实现。因此我们都是对的。 – TheCodeKing 2010-06-23 18:32:39