私は、Guid/UID に代わる人間が読める形式についての小さな記事を書いています。たとえば、TinyURL で URL ハッシュに使用されるものです (雑誌に掲載されることが多いため、短くする必要があります)。
私が生成している単純な uid は、小文字 (az) または 0-9 の 6 文字です。
「私の計算によるとキャプテン」、これは相互に排他的な 6 つのイベントですが、衝突の確率の計算は P(A または B) = P(A) + P(B) よりも少し難しくなります。以下のコードでは、50/50 を使用して数字または文字を使用するかどうかがうまくいくことがわかります。
私は衝突率に興味があります。以下のコードが予想される衝突率の現実的なシミュレーションである場合、ハッシュの生成から得られるでしょう。平均して、100 万回あたり 40 ~ 50 回のクラッシュが発生しますが、uid が一度に 100 万回生成されることはなく、おそらく 1 分間に 10 ~ 1000 回程度しか生成されないことを念頭に置いてください。
毎回のクラッシュの確率はどのくらいですか? また、より良い方法を提案できる人はいますか?
static Random _random = new Random();
public static void main()
{
// Size of the key, 6
HashSet<string> set = new HashSet<string>();
int clashes = 0;
for (int n=0;n < 1000000;n++)
{
StringBuilder builder = new StringBuilder();
for (int i =0;i < 7;i++)
{
if (_random.NextDouble() > 0.5)
{
builder.Append((char)_random.Next(97,123));
}
else
{
builder.Append(_random.Next(0,9).ToString());
}
}
if (set.Contains(builder.ToString()))
{
clashes++;
Console.WriteLine("clash: (" +n+ ")" +builder.ToString());
}
set.Add(builder.ToString());
_random.Next();
//Console.Write(builder.ToString());
}
Console.WriteLine("Clashes: " +clashes);
Console.ReadLine();
}
更新: この質問から得られた記事は次のとおりです
ここで本当に 2 つの質問をしたので、ごまかしていました。私が求めていた答えはrcarのものでしたが、Sklivvzのものも2番目の部分に対する答えです(代替)。データベースでカスタムの一意の ID ジェネレーターを作成することは可能ですか、それともクライアント側でしょうか (最初に 2 回の読み取りが可能です)。
私が求めていた一般的なアイデアは、巨大な 16 バイトの GUID ではなく、電話や印刷物で使用できるデータベースやその他のストアで ID を使用することでした。
更新 2: 2 つの独立したイベントの代わりに、相互に排他的な 2 つのイベントの式を上に置きました (最初に「a」を取得しても、2 回目に「a」を取得できないという意味ではないため)。P(A and B) = P(A) x P(B) であるべきだった