使用GUID的子字符串作为ID,在具有Asp.NET的同一台计算机上生成所有GUID

使用GUID的子字符串作为ID,在具有Asp.NET的同一台计算机上生成所有GUID,asp.net,guid,uniqueidentifier,Asp.net,Guid,Uniqueidentifier,我已经阅读了和,但仍然有一个关于使用缩短的GUID作为id的问题。我知道GUID是唯一的,但GUID的子字符串不是 我正在建立一个网站,为用户提供一个订单参考号。客户端不希望使用自动递增的Int,因为这将公开订单总数。他们也认为GUID太长,很难通过电话重复。 但是,由于我们只有一台web服务器,有人建议我们可以使用GUID的非MAC地址部分,以提供更短的唯一标识符 我的理解是,当前的GUID算法不允许这样做。这是正确的吗?在同一台机器上创建的guid可以缩短但仍然是唯一的吗?我认为这篇文章解决

我已经阅读了和,但仍然有一个关于使用缩短的GUID作为id的问题。我知道GUID是唯一的,但GUID的子字符串不是

我正在建立一个网站,为用户提供一个订单参考号。客户端不希望使用自动递增的Int,因为这将公开订单总数。他们也认为GUID太长,很难通过电话重复。 但是,由于我们只有一台web服务器,有人建议我们可以使用GUID的非MAC地址部分,以提供更短的唯一标识符


我的理解是,当前的GUID算法不允许这样做。这是正确的吗?在同一台机器上创建的guid可以缩短但仍然是唯一的吗?

我认为这篇文章解决了您的问题,同时也给出了解决方案

这是从上面的链接

每当需要生成唯一密钥时,都会使用System.Guid,但是 它很长。在很多情况下,这不是一个问题,而是在网络中 场景中,它是URL的一部分,我们需要使用它的字符串 36个字符长的表示。它会把URL和 基本上是丑陋的

要缩短它,就不可能不松开一些螺栓 GUID的唯一性,但如果我们能够接受 改为16个字符的字符串

我们可以更改标准GUID字符串表示形式:

21726045-e8f7-4b09-abd8-4bcc926e9e28

插入一个较短的字符串:

3c4ebc5f5f2c4edc

下面的方法创建较短的字符串,它实际上是 非常独特。一个1000万次的迭代并没有产生重复。信息技术 使用GUID的唯一性创建字符串

private string GenerateId()
{
 long i = 1;
 foreach (byte b in Guid.NewGuid().ToByteArray())
 {
  i *= ((int)b + 1);
 }
 return string.Format("{0:x}", i - DateTime.Now.Ticks);
}
如果你想要的是数字而不是字符串,你可以这样做 但是你需要最多19个字符。下面的方法 将GUID转换为Int64

private long GenerateId()
{
 byte[] buffer = Guid.NewGuid().ToByteArray();
 return BitConverter.ToInt64(buffer, 0);
}
标准GUID仍然是确保唯一性的最佳方法 虽然它不是100%独一无二的


您仍然可以使用自动递增的int(从10000开始),然后将其编码为加密的易于阅读/难以找到的字符串。这仍然可以保证结果是一个快速唯一的数字

例如,下面是可以执行此操作的代码

和一些样本结果

value: 9999999999 encoded: SrYsNt
value: 4294965286 encoded: ZNGEvT
value: 2292964213 encoded: rHd24J
value: 1000000000 encoded: TrNVzD
对于加密,你只需要对你的角色图进行置乱,普通用户只有很少的数字,并且不知道它们之间的关系,他们无法重新创建它们

现在,如果您赢得了使用Guid的机会,并且仍然在搜索可以截断的内容,那么下面是它的源代码:


在这段源代码中,你可以看到它是如何内置的,下一步我要做的是使用时间戳+一个随机数,然后像我上面所描述的那样再次转换它。

请阅读附带说明,你的客户可能会遇到税务机关或客户的麻烦,因为国际会计规则要求,在给定的年份内,每张发票/订单的编号都比前一张高,或者至少有一部分编号以这种方式递增(2001-001、2001-002有效)。guid、散列、随机数不符合此图。即使它看起来是一个很好的解决方案,它在这里实际做的是简单地生成一个随机数(代码
i*=((int)b+1);
),它实际上不是与
random()
相同的函数并开始为guid种子。如果你看到的随机数的源代码是相同的。所以我认为不能保证这个数字是唯一的@亚里士多德:这里我只是展示一些提问者的选择。他可以根据自己的要求修改这些。关于唯一性,请阅读我答案的最后一行。