0

いくつかの順次 GUID を作成する必要があります。

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

いくつかのテストのためにこれを行う必要があります。何千もの Guid は必要ありません...

以下を試しましたが、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

これには、「左シフト」(>>) と「ビットごとの AND」(&) を使用できます。

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, ...

以下を使用して、long からゼロ以外の 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

問題は、16 進数で表現された Int32 の最大値が 0x7FFFFFFFF だけであるため、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 をキーとして使用することはお勧めしません。しかし、あなたはチェックアウトする必要があります

COMBガイド

この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 に答える