2012-04-03 71 views
1

我正在寻找一种简单但强大的解决方案来调配独特的部件号。我一直在考虑使用GUID来识别来自不同客户端(台式机,电话等)的请求,然后根据请求GUID的插入日期时间顺序分配PN。云上的唯一ID生成

问题:SQL Azure是否使用正确的服务?有没有一个标准的方法呢?

谢谢。

回答

7

这与“在云端”无关,而是一般的分布式计算问题。

您的问题中没有足够的信息来充分理解您的要求,但我收集的是您需要为请求零件号的服务的使用者分配唯一号码。

首先想到的是GUID是一个数字(128位长)。只要您需要分配零件号码,您不能只生成一个GUID吗?如果需要的话,你可以将GUID散列成一个无符号长整数(城市哈希是我最喜欢的64位散列,用于这种类型的应用),散列冲突的风险非常小,除非你处理数十亿个零件号。如果你觉得你想要散列成32位数字,可以看看Birthday Problem。散列冲突将比仅用32位更为频繁。

如果您必须分配序号,则必须在处理中引入序列化点。您将需要一些服务(可能是数据库表上的标识列)来统计单个部件号请求并分配下一个更大的数字。

如果您通常希望数量较小,但它们不一定必须是连续的,则可以允许每个可能处理这种请求的服务器管理它自己的数字范围(例如,给定的服务器可以“检出”一个块从中央服务器中分配1000个零件号码,分配它们直到它们用完,然后“检出”一个新的数字块)。这并不能保证当前分配的所有号码都是连续的,因为多台服务器可以以不同的速率分配号码。另外,如果您没有正确管理应用程序崩溃,您可以“丢失”已签出但未完全分配的数字块的一部分。

+0

是否有一个C#实现CityHash在那里? – JMarsch 2012-04-03 22:07:32

+0

@JMarsch:在那里,不,但从C++端口非常简单。我在一个小时内为一位前雇主做了这件事。 – 2012-04-03 22:54:30

+0

@EricJ .:我提到了云,因为我们没有可以保证可用性接近云解决方案的服务器。我们有人出门在外,需要为报价生成PN。我认为我们有点在同一页面上。我最初的想法是将请求GUID插入到数据库中,然后生成PN。 – 2012-04-04 20:36:04

0

你可能想看看这一个:SnowMaker – a unique id generator

+0

我也在看。谢谢 – 2012-04-04 20:39:15

+0

SnowMaker在Azure移动服务上进行了一些修改(主要涉及移动服务dll而不是项目中包含的移动服务dll)对我而言效果很好。 – 2015-03-10 01:38:52