web-dev-qa-db-ja.com

妥当な時間内に繰り返されない一意の番号を生成する方法は?

私はリモートWebサービスと統合/テストしており、それが「QA」エンドポイントであるにもかかわらず、every呼び出しで一意のメールアドレスを強制します。

_DateTime.Now.Ticks_(例:634970372342724417)とGuid.NewGuid()を考えることができますが、どちらもmax。 20文字(またはできますか?)。

最後に使用した数値を含む数値をファイルに書き出してから_[email protected], [email protected], etc..._を使用するのはそれほど難しいことではないと思いますが、状態の持続を回避できる場合は常に使用します。

誰かが私が最大長20文字の(最大長のguid)= 14 = 20-「@ x.com」の長さ?

13
Aaron Anodide

同じ「ティック」で2つの電子メールアドレスを生成しないと想定している場合は、ティックを使用して電子メールアドレスを生成できます。

ただし、ティックが64ビットの数値であり、その数値を書き出すと、20文字を超えることになります。

トリックは、別のスキームを使用して64ビットの数値をエンコードすることです。西部のアルファベット+ 10桁の26文字を使用できると仮定します。これは36の可能な文字になります。 5ビットを取ると、32文字を表すことができます。それで十分でしょう。 64ビットを5ビットのグループに分割します(64/5は約13グループです)。 5ビットごとに1文字に変換します。これにより、最終的に13文字になりますが、その前に文字を追加することができます)。

long ticks = DateTime.Now.Ticks;
byte[] bytes = BitConverter.GetBytes(ticks);
string id = Convert.ToBase64String(bytes)
                        .Replace('+', '_')
                        .Replace('/', '-')
                        .TrimEnd('=');
Console.WriteLine (id);

収量:

Gq1rNzbezwg
20
Patrick

各呼び出しの間に少なくとも1秒を指定したため、これは機能するはずです。

DateTime.Now.ToString("yyyyMMddHHmmss");

そのちょうど14文字。

12

日時から次の数字を取得すると、それを機能させることができるはずです...次のようなもの:

DateTime.Now.ToString("yyMMddHHmmssff");

これは16文字で、必要に応じて4を他のプレフィックスに残します。

したがって、2013年2月21日の約10:21は「130321102142」となり、次は「130321102169」となります。

日時のフォーマットの詳細については、 http://msdn.Microsoft.com/en-us/library/zdtaw1bw.aspx を参照してください。

10
EtherDragon
    /// <summary>
    /// Get a unique reference number.
    /// </summary>
    /// <returns></returns>
    public string GetUniqueReferenceNumber(char firstChar)
    {
        var ticks = DateTime.Now.Ticks;
        var ticksString = ticks.ToString();
        var ticksSubString = ticksString.Substring((ticksString.Length - 15 > 0) ? ticksString.Length - 15 : 0); 
        if (this.currentTicks.Equals(ticks))
        {
            this.currentReference++;

            if (this.currentReference >= 9999)
            {
                // Only when there are very fast computers.
                System.Threading.Thread.Sleep(1);
            }

            return (firstChar + ticksSubString + this.currentReference.ToString("D4")).PadRight(20, '9');
        }

        this.currentReference = -1;
        this.currentTicks = ticks;
        return (firstChar + ticksSubString).PadRight(20, '9');
    }

私の場合、一意の最初の文字と最大20文字の一意の参照番号を作成する必要がありました。多分あなたは以下の関数を使うことができます、それはあなたが1ティック内で9999のユニークな数を作成することを可能にします。 (ゼロを含む)

もちろん、最初の文字と最大文字数20なしで独自の実装を作成できます。

0

追加するだけです...ティックからの数値のみを使用したい場合は、substringを使用することができます。次に例を示します。

int onlyThisAmount = 20;
string ticks = DateTime.Now.Ticks.ToString();
ticks = ticks.Substring(ticks.Length - onlyThisAmount);
0
Michel Ayres