.NET dllを持ち込むことを嫌がらないのであれば、私はこれを正確に行うためのプロジェクトを作成しました。ソースはここのGitHubにあり、バイナリはIdGeneratorNuGetパッケージにあります。
順序付けられたシーケンスおよび/またはユーザー指定の長さのランダムな値をすべてbase-36で提供します。IDは、複数のIDジェネレーターインスタンスがある場合や分散環境であっても、普遍的に一意です。
var generator = new Base36IdGenerator(
numTimestampCharacters: 11,
numServerCharacters: 4,
numRandomCharacters: 5,
reservedValue: "",
delimiter: "-",
delimiterPositions: new[] {15, 10, 5});
// This instance would give you a 20-character Id, with an
// 11-character timestamp, 4-character servername hash,
// and 5 character random sequence. This gives you 1.6 million
// hash combinations for the server component, and 60 million
// possible combinations for the random sequence. Timestamp is
// microseconds since epoch:
Console.WriteLine(generator.NewId());
// 040VZC6SL01003BZ00R2
// Argument name specified for readability only:
Console.WriteLine(generator.NewId(delimited: true));
// 040VZ-C6SL0-1003B-Z00R2
もちろん、順序付けられたシーケンスを持つよりも文字列が推測できないことに関心がある場合は、GetRandomStringメソッドを使用できます。
// 6-characters give you a little over 2 billion possible
// combinations (36 ^ 6). 7 characters is about 78 billion.
Console.WriteLine(generator.GetRandomString(length: 6));
その背後にある基本原則は次のとおりです。
- エポックからマイクロ秒を取得(64ビット数)
- 0から(36 ^希望の長さ)までの乱数(64ビット)を取得します(最大13)
- サーバー名ハッシュを取得する(単純なSha1)
- 各コンポーネントをbase-36文字列に変換します
0
パッドを希望の長さに残します
Base36エンコーダー自体はhttp://www.stum.de/2008/10/20/base36-encoderdecoder-in-c/からのものです。