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