小Z最近在做商城模块,其中有Coupon代金券支付的功能,这里面涉及到激活码生成的问题,现在约定的是随机产生数字的11位激活码,因为用户在手机上输入数字英文混合的激活码是非常不方便的一件事情(有种方法是new Guid(),然后replace掉“-”),小Z设想是产生10万的随机激活码不重复,代码如下:
<span style="white-space:pre"> </span>/// <summary>
/// 随机生成11位激活码
/// </summary>
/// <param name="offset">偏移毫秒数</param>
/// <returns>激活码</returns>
private string createActivationCode(int offset)
{
//根据当前时间戳生成random seed
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
//减去10万毫秒内置偏移秒数,再加偏移毫秒数
int seed = Convert.ToInt32(ts.TotalSeconds) - 100000 + offset;
Random r = new Random(seed);
long newActivationCode = 0;
for (int i = 0; i < 11; i++)
{
int randomNum = r.Next(0, 9);
newActivationCode = newActivationCode * 10 + randomNum;
}
var result = newActivationCode.ToString();
if (result.Length < 11)
{
for (int i = result.Length; i < 11; i++)
{
result = "0" + result;
}
}
return result;
}
当然函数的有效性还需要进一步验证,这里是希望通过时间去产生随机因子(同一毫秒内随机因子相同,目前看生成的随机数也是相同的,不满足需求),这样减去一个偏移量(小于10万),这样我想至少一次生成1000个激活码应该是不会重复,且满足需求。