几种生成不重复字符串的方法比较

想要拿它作为唯一关键字,又不想要GUID那么长位数,找到一些方法,也问了一些人,结果自己测试了一下比较了一下,特将几种方式记录下来存档。

方法一:利用Path.GetRandomFileName方法去生成12位的随机字符串。经过粗略测试,生成1千万条数据没有发现重复的记录,不过要是截取其中的8位的话会有重复的。

public string GetRandomString()
{
    string path = Path.GetRandomFileName();
    path = path.Replace(".", ""); 
    return path;
}

方法二:通过加密算法得到字符串。经过1千万条数据的测试,目前生成12位字符串的时候没有发现有重复记录。

public string GetUniqueKey(int maxSize)
{
    char[] chars = new char[62];
    chars =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
    byte[] data = new byte[1];
    RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
    crypto.GetNonZeroBytes(data);
    data = new byte[maxSize];
    crypto.GetNonZeroBytes(data);
    StringBuilder result = new StringBuilder(maxSize);
    foreach (byte b in data)
    {
        result.Append(chars[b % (chars.Length - 1)]);
    }
    return result.ToString();
}

方法三:利用随机数去得到字符串。这里生成的是32位的字符串,1千万条数据测试没有重复。貌似把程序里面的32改成12,生成12位的时候也没有重复。

private static char[] charSet =
fghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
 
private static Random rGen = new Random();
public string GenerateRandomString()
{
    byte[] rBytes = new byte[32];
    rGen.NextBytes(rBytes);
    char[] rName = new char[32];
    for (int i = 0; i < 32; i++)
        rName[i] = charSet[rBytes[i] % 62];
    string rdstr=new string(rName);
    return rdstr;
}

经过测试GUID的截取不满足条件。各位有好的方法请告知。

posted @ 2010-07-29 16:49  bluesky4485  阅读(2247)  评论(1编辑  收藏  举报