0

16 文字、月に約 100,000 文字を生成する必要があります。複数の実行にわたって繰り返されないようにする必要があります (月に 1 回、毎月)。これを達成するための最良の方法は何ですか?ハッシュ関数を使用することは良い考えですか? 文字列には、A ~ Z と 0 ~ 9 のみを含めることができます。これは、C# を使用して行う必要があります。編集:文字列はランダムにする必要があります。したがって、単純なカウンターを維持することはオプションではありません。

4

3 に答える 3

1

英数字は 16 文字に制限されているため、GUID はおそらくオプションではありません。128 ビット全体を一意にする必要があり、16 文字の文字列が生成されますが、必ずしも英数字の制約に適合するとは限りません。

単純なカウンターを用意して、MD5 ハッシュの最後の 64 ビットを返し、毎回一意性をチェックすることができます。

//parse out hex digits in calling code
static long NextHash(HashSet<long> hashes, int count)
{
    System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();
    long l = BitConverter.ToInt64(md5.ComputeHash(IntToArray(count)));
    if(!hashes.Contains(l)){
        hashes.Add(l);
        return l;
    } else return -1; //check this in calling code for failure
}
static byte[] IntToArray(int i)
{
    byte[] bytes = new byte[4];
    for(int j=0;j<4;j++){
    bytes[j] = (byte)i;
    i>>=8;    
    }
}

GUIDS についても同様のことができますが、部分文字列のみを見ているときに衝突が発生する可能性がどの程度かはわかりません。MD5 ハッシュには、関連性があれば、よりランダムに「現れる」という利点があります。

于 2013-06-10T08:48:47.013 に答える
0

それがあなたを満足させるかどうかはわかりませんが、私はそのようなsthを思いつきました

static List<string> generate(int count)
{
    List<string> strings = new List<string>();
    while (strings.Count < count)
    {
        Guid g = Guid.NewGuid();                
        string GuidString = g.ToString();
        GuidString = GuidString.Replace("-", "");
        GuidString = GuidString.Remove(16);
        if (!strings.Contains(GuidString))
            strings.Add(GuidString);
    }
    return strings;
}
于 2013-06-10T07:50:09.260 に答える
0

言語が指定されていません。

PHP、

http://php.net/manual/en/function.uniqid.php

echo rand(0,999).uniqid();
rand(0,999) = 3 characters randomly
uniqid() = 13 randomly characters 
于 2013-06-10T06:52:18.950 に答える