如何生成优惠券?!

时间:2022-12-26 22:35:34
项目要做优惠券,有号码,密码!
当然这两个是唯一的,不能有重复!
大家有好什么的思路吗?

13 个解决方案

#1


guid
根据最大值+时间等生成号码

#2



  C#中的随机函数
System.Random r = new Random();

int yourandom = r.Next(0,100) //0到100之间的整型随机数 

// C#随机生成数字、字母 (公用类)
产生62位内任意数字大小写字母的随机数     
  private   static   char[]   constant=   
      {   
        '0','1','2','3','4','5','6','7','8','9',   
        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',   
        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'   
      };   
      public   static   string   GenerateRandom(int   Length)   
      {         
        System.Text.StringBuilder   newRandom   =   new   System.Text.StringBuilder(62);   
        Random   rd=   new   Random();   
        for(int   i=0;i<Length;i++)   
        {   
          newRandom.Append(constant[rd.Next(62)]);   
        }   
        return   newRandom.ToString();   
      }   




将生成的随机数最好用数据库存储一下
每次生成到库里判断一下是否存在

select coutn(1) from  tb where id=随机数

#3


可以参考下生成身份证号的方法。

#4


个人感觉GUID还是比较靠铺

#5


用GUID作为主键列,重复的自然就不能插入了

#6


MD5编码也可以的~~~

#7


变量数组
Random rand = new Random(Guid.NewGuid().GetHashCode());  
rand .Next(最小值,最大值)  
Random rnd = new Random(Environment.TickCount); 获取无重复的数据

#8


不知道你在什么地方使用,如果是在一些没有字母的输入键的地方使用,那就麻烦
那就建议使用一个线性的方程式,或者抛物线(只使用一侧)
这样产生的数字也是唯一的

#9


就是在购物网站中用的,

 private long GenerateId()
    {
        byte[] buffer = Guid.NewGuid().ToByteArray();
        return BitConverter.ToInt32(buffer, 0);
    }

生成出来的像:5020365391994185848 
boss就太长了!


 private string GenerateId(string flag)
    {
        long i = 1;
        foreach (byte b in Guid.NewGuid().ToByteArray())
        {
            i *= ((int)b + 1);
        }
        return string.Format("{0:x}", i - DateTime.Now.Ticks);
    } 


生成出来的像:aded0a2611f8aa4a  
boss也说这样不好,数据与字母没有分隔符,不好
汗啊

#10


GUID有分割呀

#11


如果只是编号问题,可以这样:1010070070002423

前6位是日期,之后四位是券的类型编号(例如其中涵盖了厂商编号),最后6位是某日期、某券类型之下所产生的券的顺序流水号。

#12


当然如果要缩短,年月日可以用三位字符/数字来产生(因为字母加数字可以表示36个值,足够表示日),然后是5位流水号(流水号每日都从1号重新编码),这样就使用8个字符就行了。

#13


引用 11 楼 sp1234 的回复:
如果只是编号问题,可以这样:1010070070002423

前6位是日期,之后四位是券的类型编号(例如其中涵盖了厂商编号),最后6位是某日期、某券类型之下所产生的券的顺序流水号。
这个比较靠谱。

sql区问会有更多答案。

#1


guid
根据最大值+时间等生成号码

#2



  C#中的随机函数
System.Random r = new Random();

int yourandom = r.Next(0,100) //0到100之间的整型随机数 

// C#随机生成数字、字母 (公用类)
产生62位内任意数字大小写字母的随机数     
  private   static   char[]   constant=   
      {   
        '0','1','2','3','4','5','6','7','8','9',   
        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',   
        'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'   
      };   
      public   static   string   GenerateRandom(int   Length)   
      {         
        System.Text.StringBuilder   newRandom   =   new   System.Text.StringBuilder(62);   
        Random   rd=   new   Random();   
        for(int   i=0;i<Length;i++)   
        {   
          newRandom.Append(constant[rd.Next(62)]);   
        }   
        return   newRandom.ToString();   
      }   




将生成的随机数最好用数据库存储一下
每次生成到库里判断一下是否存在

select coutn(1) from  tb where id=随机数

#3


可以参考下生成身份证号的方法。

#4


个人感觉GUID还是比较靠铺

#5


用GUID作为主键列,重复的自然就不能插入了

#6


MD5编码也可以的~~~

#7


变量数组
Random rand = new Random(Guid.NewGuid().GetHashCode());  
rand .Next(最小值,最大值)  
Random rnd = new Random(Environment.TickCount); 获取无重复的数据

#8


不知道你在什么地方使用,如果是在一些没有字母的输入键的地方使用,那就麻烦
那就建议使用一个线性的方程式,或者抛物线(只使用一侧)
这样产生的数字也是唯一的

#9


就是在购物网站中用的,

 private long GenerateId()
    {
        byte[] buffer = Guid.NewGuid().ToByteArray();
        return BitConverter.ToInt32(buffer, 0);
    }

生成出来的像:5020365391994185848 
boss就太长了!


 private string GenerateId(string flag)
    {
        long i = 1;
        foreach (byte b in Guid.NewGuid().ToByteArray())
        {
            i *= ((int)b + 1);
        }
        return string.Format("{0:x}", i - DateTime.Now.Ticks);
    } 


生成出来的像:aded0a2611f8aa4a  
boss也说这样不好,数据与字母没有分隔符,不好
汗啊

#10


GUID有分割呀

#11


如果只是编号问题,可以这样:1010070070002423

前6位是日期,之后四位是券的类型编号(例如其中涵盖了厂商编号),最后6位是某日期、某券类型之下所产生的券的顺序流水号。

#12


当然如果要缩短,年月日可以用三位字符/数字来产生(因为字母加数字可以表示36个值,足够表示日),然后是5位流水号(流水号每日都从1号重新编码),这样就使用8个字符就行了。

#13


引用 11 楼 sp1234 的回复:
如果只是编号问题,可以这样:1010070070002423

前6位是日期,之后四位是券的类型编号(例如其中涵盖了厂商编号),最后6位是某日期、某券类型之下所产生的券的顺序流水号。
这个比较靠谱。

sql区问会有更多答案。