.resx ファイル内である種の一意の識別子を使用しようとしていますが、キーを数字で始めることはできません。文字で始まる GUID を取得するまで GUID を循環させるのではなく、数字を含まない、またはこの要件を満たす代替の UID タイプがあるかどうか疑問に思っています。
何かご意見は?
.resx ファイル内である種の一意の識別子を使用しようとしていますが、キーを数字で始めることはできません。文字で始まる GUID を取得するまで GUID を循環させるのではなく、数字を含まない、またはこの要件を満たす代替の UID タイプがあるかどうか疑問に思っています。
何かご意見は?
文字で始まる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 番目の例ではさらに顕著です)。出力が実際の GUID であることを気にしない場合は、他の人が示唆しているように、単純に 16 進数を別のものに再マップし、結果を文字列として返すことができます。FWIW、これが私が考えることができる最短の解決策です:
return String.Concat(Guid.NewGuid().ToString("N").Select(c => (char)(c + 17)));
これは、16 進数の 0 ~ 9 を ~ の文字にマップし、16A
進J
数のA
-を~F
の文字にマップします。また、ハイフンなしの文字列も生成します。例えば:r
w
Before: e58d0f329a2f4615b922ecf53dcd090a
After: vFIuAwDCJrCwEGBFsJCCvtwFDutuAJAr
もちろん、ここで大文字と小文字が混在するのが気に入らない場合は、これをすべて大文字または小文字に変換できます。
擬似ランダム シーケンス ジェネレーターを作成して使用できます。基本的なアイデアを提供するものは次のとおりです。
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 のようなジェネレーターを作成するだけで、有効な文字は az になります (確率の数を増やすために AZ を使用することもできます)。