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

想要拿它作为唯一关键字,又不想要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的截取不满足条件。各位有好的方法请告知。

转载于:https://www.cnblogs.com/bluesky4485/archive/2010/07/29/1788053.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值