如题,我自己写了一个,是根据系统时间来产生的,但是后来觉得这样也不是唯一的,
(date.getMonth() + 1) * 0x5f5e100 + 
date.getDate()* 0xf4240 + 
date.getHours() * 10000 + 
date.getMinutes() * 100 + 
date.getSeconds();位数还不够,而且同一秒产生的流水号是相同的 ,我要产生流水号是唯一的。求各位给个函数
谢谢了

解决方案 »

  1.   

    java有隨機的一個類,自己看api
      

  2.   

    再不行的话,使用 System.nanoTime(); 获得纳秒时间,精度够高了吧。
      

  3.   

    如果长度可以放宽,考虑一下java.util.UUID
      

  4.   

    时间后面加上序号,就没问题了。序号增长需要synchronize一下,并且要进行模运算,比如:short seq = 0;
    final short MAX_PER_SECOND = 10000;private synchronized short getNextSeq() {
      seq ++;
      seq %= MAX_PER_SECOND;
    }这样只要你在一秒内没有生成超过10000个号码,就不会重复。
    可以修改那个常量以提供更大的适应性。
    不过,因为synchronized操作需要耗时间,所以实际上会降低每秒的处理数。这个方法在这儿仅供参考。
      

  5.   

    哦,忘了写
    return seq惭愧啊!
      

  6.   

    System.out.println(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()));
      

  7.   

    如题,我自己写了一个,是根据系统时间来产生的,但是后来觉得这样也不是唯一的,
    (date.getMonth() + 1) * 0x5f5e100 +
    date.getDate()* 0xf4240 +
    date.getHours() * 10000 +
    date.getMinutes() * 100 +
    date.getSeconds();位数还不够,而且同一秒产生的流水号是相同的 ,我要产生流水号是唯一的。位数不够:可以用两个整型数来表示流水号,而不要用一个.
    保证流水号唯一:要记录已经产生的流水号,当产生新的时候,要去查找一下,新产生的流水号是否已经存在,如存在,再产生一个,直到找到一个合法的.产生两个七位的数连成十四位的流水号:产生两个在1000000与10000000之间的随机数就行了.
      

  8.   

    取8位自增,再找的常数xor一下。其余6位随机。
    然后把那随机的6位按统一方式插入前8位。
    估计就没人编得出来了。
    想防伪就留几位作效验。
      

  9.   

    我写的,抛个砖,能看懂么/**
         * getPK,获得数据库使用的一个long型唯一主键
         * 16位,同一微秒内3000个不会重复
         * @return long
         */
        private static long[] ls = new long[3000];
        private static int li = 0;
        public synchronized static long getPK()
        {
            long lo = getpk();
            for (int i = 0; i < 3000; i++)
            {
                long lt = ls[i];
                if (lt == lo)
                {
                    lo = getPK();
                    break;
                }
            }
            ls[li] = lo;
            li++;
            if (li == 3000)
            {
                li = 0;
            }
            return lo;
        }    private static long getpk()
        {
            String a = (String.valueOf(System.currentTimeMillis())).substring(3, 13);
            String d = (String.valueOf(Math.random())).substring(2, 8);
            return Long.parseLong(a + d);
        }