商城类的系统都需要生成订单号,订单号的生成规则各个都不一样
*自定义的自增编号
*日期(yyyyMMdd)+随机数(n位)
*日期(yyyyMMdd)+userid+随机数(n位)
等等之类的,我做商城时也纠结这个订单号生成规则。所以简单记录下自己的订单号规则:
- 订单号必须是唯一的
- 订单号的长度尽量的短
- 让内部人看到订单号后能获取一定的信息
- 外部人不能推测下一个订单号或者看出某天的销量
- 尽量都用数字
我的订单号类似:01101801136675,规则是:
01:代表订单的来源标示(就2位)
10:代表特殊的主体代号
180113:代表18年1月13号的订单
6675:代号自增数(这个是redis中自增的数,然后把这个数用Base10Code转换,其中CharList自己定义字符的顺序)
public class Base10Code
{
private const string CharList = "0987456312";
public static String Encode(long input)
{
if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");
input += 10 * 10 * 10;
char[] clistarr = CharList.ToCharArray();
var result = new Stack<char>();
while (input != 0)
{
result.Push(clistarr[input % 10]);
input /= 10;
}
return new string(result.ToArray());
}
public static Int64 Decode(string input)
{
var reversed = input.ToUpper().Reverse();
long result = 0;
int pos = 0;
foreach (char c in reversed)
{
result += CharList.IndexOf(c) * (long)Math.Pow(10, pos);
pos++;
}
result -= 10 * 10 * 10;
return result;
}
}