5

.resx ファイル内である種の一意の識別子を使用しようとしていますが、キーを数字で始めることはできません。文字で始まる GUID を取得するまで GUID を循環させるのではなく、数字を含まない、またはこの要件を満たす代替の UID タイプがあるかどうか疑問に思っています。

何かご意見は?

4

7 に答える 7

12

文字で始まるGuid を作成したいだけの場合は、次のようにすることができます。

var b = Guid.NewGuid().ToByteArray();
b[3] |= 0xF0;
return new Guid(b);

これにより、常に 16 進数で始まる GUID が生成されますF

数字を含まない Guid を作成するには、次のようなものを使用できます。

return new Guid(Guid.NewGuid().ToByteArray()
    .Select(b => (byte)(((b % 16) < 10 ? 0xA : b) | 
                        (((b >> 4) < 10 ? 0xA : (b >> 4)) << 4)))
    .ToArray());

これは、各 16 進数 (1 バイトあたり 2 つ) をテストしA、それが より小さい場合に強制しAます。


上記のソリューションはどちらも実際のGuidオブジェクトを生成しますが、追加された制限により、結果として得られる GUID の一意性がある程度低下します (2 番目の例ではさらに顕著です)。出力が実際の G​​UID であることを気にしない場合は、他の人が示唆しているように、単純に 16 進数を別のものに再マップし、結果を文字列として返すことができます。FWIW、これが私が考えることができる最短の解決策です:

return String.Concat(Guid.NewGuid().ToString("N").Select(c => (char)(c + 17)));

これは、16 進数の 0 ~ 9 を ~ の文字にマップし、16AJ数のA-を~Fの文字にマップします。また、ハイフンなしの文字列も生成します。例えば:rw

Before: e58d0f329a2f4615b922ecf53dcd090a
After:  vFIuAwDCJrCwEGBFsJCCvtwFDutuAJAr

もちろん、ここで大文字と小文字が混在するのが気に入らない場合は、これをすべて大文字または小文字に変換できます。

于 2013-09-05T20:53:12.480 に答える
2

擬似ランダム シーケンス ジェネレーターを作成して使用できます。基本的なアイデアを提供するものは次のとおりです。

class RandomLetterSequence { 
    private static Random r; 
    private static char MinChar = (char) 0x0061; 
    private static char MaxChar = (char) 0x007A; 

    public static string RandomSequence() { 
        return RandomSequence(32);  
    }

    public static string RandomSequence(int length) { 
        if (r == null)
            r = new Random(); 
        var sb = new StringBuilder(); 
        for (int i = length; i >= 0; i--) { 
            sb.Append((char)(r.Next(MinChar, MaxChar))); 
        }
        return sb.ToString();
    }
}

この実装では、要件に適合する 26^32 の異なるシーケンスが生成されます。

  • 衝突率に関しては GUID と同様 (無限に小さい)
  • 文字のみを含む
于 2013-09-05T21:03:39.390 に答える
1

独自の GUID のようなジェネレーターを作成するだけで、有効な文字は az になります (確率の数を増やすために AZ を使用することもできます)。

于 2013-09-05T20:53:13.730 に答える