zoukankan      html  css  js  c++  java
  • 几种生成不重复字符串的方法比较

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

  • 相关阅读:
    N皇后求解。万万没想到,只用一个一维数组就搞定了。还体现了回溯。
    图的存储与实现(一),使用邻接矩阵
    201671010139 2016-2017-2 《Java程序设计》关于java的初学体验总结
    题目常用解法
    【问题】如何批量导出AI文件里内嵌的图片
    安全算法基础(一)
    对安全的认知
    6月
    渗透--还是tp
    c++学习————VC报错解决方案(vc2013)
  • 原文地址:https://www.cnblogs.com/bluesky4485/p/1788053.html
Copyright © 2011-2022 走看看