0

我需要创建一些顺序指南:

00000000-0000-0000-00000000000000001
00000000-0000-0000-00000000000000002
...
00000000-0000-0000-00000000000000011

我需要这样做只是为了进行一些测试。我不需要成千上万的向导...

我尝试了以下方法,但是当我达到 11 时遇到问题。

for (Int32 i = 1; i < 12; i++) {
  Guid guid = new Guid(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (Byte)i);
}

有什么办法可以解决这个问题?

也许将 int 转换为具有格式的字符串,然后转换为 Guid?

我真的不知道如何解决这个问题......

谢谢你,米格尔

4

5 回答 5

4

你的 guid 实际上是无效的,它应该是00000000-0000-0000-0000-000000000000.

考虑到这一点,并假设您不会更改超过 12 位数字,您可以进行一些字符串格式化:

for (Int32 i = 1; i < 12; i++) 
{
    string s = "00000000-0000-0000-0000-" + i.ToString("D12");
    Guid guid = new Guid(s);
}

当然,如果您坚持使用原始格式,则以下行将执行此操作:

string s = "00000000-0000-0000-" + i.ToString("D17");
于 2013-11-06T16:59:06.450 回答
1

您可以为此使用“左移”(>>)和“按位与”(&),例如

short lowest16bit = i & 0xffff;
byte next8bit = (i>>8) & 0xff;

要创建 GUID,您需要 128 位,常规的 int 是 32 位,long 是 64 位。

使用您使用的构造函数(MSDN):

Guid(int a, short b, short c,
    byte d, byte e, byte f, byte g, byte h, byte i, byte j, byte k);

您可以使用以下方法从 int 创建具有 32 个非零位的非随机 Guid:

int i;
Guid g = new Guid(i, (short)0, (byte)0, (byte)0, (byte)0, ...

您可以使用以下命令创建一个具有 64 个非零位的非随机 Guid:

long l;
Guid g = new Guid((l>>32) & 0xffffffff, (l>>16) & 0xffff, l & 0xffff, (byte)0, ....);

等等。

于 2013-11-06T16:59:04.963 回答
1

问题是,以十六进制表示的 Int32 的最大值仅为 0x7FFFFFFF,因此 guid 中会有很多空余空间。

正如@Yosi 所说,这并不是他们真正想要的,但基于这是你所要求的,那么这个呢:

 var guid = "00000000-0000-0000-0000-" + i.ToString("D12")

并生成一个序列,如下所示:

 for (int i = 0; i < 2000; i++)
 {
     var guidStr = "00000000-0000-0000-0000-" + i.ToString("D12");
     var guid = new Guid(guidStr);
     Console.WriteLine(guid);
 }
于 2013-11-06T17:01:06.357 回答
0

我不建议使用 guid 作为键。但是,你应该看看

梳状导轨

这个 SO 问题

使用 Sql Server 语法,它使用以下算法生成顺序 Guid。

DECLARE @aGuid UNIQUEIDENTIFIER

SET @aGuid = CAST(CAST(NEWID() AS BINARY(10)) 
           + CAST(GETDATE() AS BINARY(6)) AS UNIQUEIDENTIFIER)
于 2013-11-06T16:57:52.523 回答
0

这应该可以为您减轻负担-如果您需要更多,那就太难了!

for (long i = 1; i < long.MaxValue; i++)
{
    var bytes = new byte[16];
    var lngBytes = BitConverter.GetBytes(i);
    Array.Copy(lngBytes, bytes, 8);
    Array.Reverse(bytes);
    var guid = new Guid(bytes);
}

(实际上,如果你使用 long.MaxValue,你可能会遇到内存不足的异常!所以使用一些合理的东西!)

编辑:

好的,无论如何我都必须这样做:

var gids = new List<Guid>();

for (long i = 1; i < 10000; i++)
{ 
     // Skip any values that we don't want
     if ((float)i / 16 % 1 >= 0.625)
     {
         i += 5;
         continue;
     }

     var bytes = new byte[16];
     var lngBytes = BitConverter.GetBytes(i);
     Array.Copy(lngBytes, bytes, 8);
     Array.Reverse(bytes);
     gids.Add(new Guid(bytes));
 }

一种很好的数学方法.. :) (啊,它实际上在 100 次迭代后就死了,但我确定我只需要调整跳过公式!)

于 2013-11-06T17:11:06.830 回答