超级难题,在一个Web系统中,怎样产生7为数字。使各个用户产生的都不重复这个数字是用来作为数据库中的ID的。不能重复。(条件限制,不能用数据库中的自增字段)

解决方案 »

  1.   

    /// <summary>
    /// 获取随机字符串根据guid生成
    /// </summary>
    /// <param name="len">不能大于36</param>
    /// <returns></returns>
    public static string GetGuidRandom(int len)
    {
    string strSep = ",";
    string strChar = "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,-";
    string intChar = "0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6";
    char[] chrSep = strSep.ToCharArray(); 
    char[] intSep = strSep.ToCharArray(); 
    string[] aryChar = strChar.Split(chrSep, strChar.Length);
    string[] aryInt = intChar.Split(intSep, intChar.Length);
    string guid = System.Guid.NewGuid().ToString();
    for(int i =0;i<aryChar.Length;i++)
    {
    guid=guid.Replace(aryChar[i],aryInt[i]);
    }
    return guid.Substring(0,len);
    }
      

  2.   

    用GUID...7位数字不到千万级,假如你的用户多数据量大的话很快就用完了...
      

  3.   


    Random r=new Random(); 
    List <int> list=new List <int>(); 
    for(int i=0;i <=7;i++) 
    list.Add(r.Next(1,50));
      

  4.   

    判读数据库中最大值,之后加1 ,转换成7位数字。就可以了。oracle中可以用序列
      

  5.   

    這個還好吧,第一種方法是用2樓說的循環。
    第二種是將將0~9按順序排,然后洗牌,最后取前面七位就可以了。第一種方法:        public static string CreatePassword()
            {
                string fullPassword = "0123456789";
                int[] tempr = { -1, -1, -1, -1, -1, -1, -1, -1 };//糾正取不到0...
                string retPassword = "";            DateTime d = DateTime.Now;
                Random rnd = new Random(d.Millisecond);            for (int i = 0; i < 8; i++)
                {
                    int r = rnd.Next(0, fullPassword.Length);//糾正取不到Z
                    for (int k = 0; k < tempr.Length; k++)
                    {
                        if (tempr[k] == r)
                        {
                            r = rnd.Next(0, fullPassword.Length);//糾正取不到Z
                            k = -1;//糾正第一個字符竟然可以重復1次的BUG
                        }
                    }
                    tempr[i] = r;
                }            for (int i = 0; i < 8 i++)
                {
                    retPassword = retPassword + fullPassword.Substring(tempr[i], 1);
                }
                return retPassword;
            }
    第二種方法:
        private string RandomList()
        {
            string str = "";
            Random rand = new Random();
            int[] a = new int[10];
            for (int i = 0; i <= 9; i++)
            {
                a[i] = i;
            }        for (int i = 9; i >= 1; i--)
            {
                swap(ref a[i], ref a[rand.Next(1, 100) % i]);
            }        for (int m = 0; m < 10; m++)
            {
                str += a[m];
                str += ",";
            }
            return str;
        }    private void swap(ref int a,ref int b)
        {
            int temp = a;
            a = b;
            b = temp;
        }
      

  6.   


    <script type="text/javascript"> 
    <!-- 
    function RndNum(n) 

        var rnd=""; 
        for(var i=0;i<n;i++) 
            rnd+=Math.floor(Math.random()*10); 
        return rnd; 

    var now=new Date(); 
    var bl=false; 
    var arr =new Array(); 
    for (var j=0;j<1000;j++) 

         
        var v =RndNum(4);  
        arr.push(v); 
        for(var z = 0;z <arr.length-1;z++) 
        { 
            if(v == arr[z]) 
            { 
                document.writeln(v+"---重复<br/>"); 
                bl=true; 
                break; 
            } 
        } 
        if(!bl) 
        { 
            document.writeln(arr[j]+"<br/>"); 
        } 
        bl=false; 

    var newnow=new Date(); 
    N=newnow-now 
    alert("所用时间为:"+N+"毫秒") //--> 
    </script>经测试,当生成的数量>生成位数的阶乘时,就会出现重复。例如RndNum(10),当for (var j=0;j<1000;j++)中J的值超过10*9*8*7*6*5*4*3*2*1时,就会重复。
      

  7.   

    数据库的字段类型设置为:uniqueidentifier
    程序中赋值:Guid id = Guid.NewGuid();
    这样子就不会产生重复的
    7位的话数据多了看你怎么办