文章正文

主流唯一标识uuid的代码

来源:  tonyge  2007-5-9 15:22:12 网友评论 0 条 字体:[ ] ~我要投稿!

package com.Umlm.common;

 

import java.io.*;
import java.net.*;
//import java.util.*;


// Referenced classes of package com.bap.common:
//            UuidException

public class Uuid
    implements Serializable
{

    public static synchronized Uuid create()
        throws Exception
    {
        if(timeStamp == 0L)
            setTimeStamp();
        if(adapterAddress == 0L)
            setAdapterAddress();
        Uuid uuid = new Uuid();
        long midTime = timeStamp >> 32 & 0xffffffffL;
        uuid.high = timeStamp <<32 | midTime << 16 & 0xffff0000L | 4096L | timeStamp >> 48 & 4095L;
        int count = instanceCounter++;
        if(count == 0x1fffffff)
        {
            instanceCounter = 0;
            setTimeStamp();
        }
        uuid.low = ((long)count & 0x1fffffffL) << 32 | 0xe000000000000000L | adapterAddress;
        return uuid;
    }

    private Uuid()
    {
        str36 = null;
    }

    private Uuid(long high, long low)
    {
        str36 = null;
        this.high = high;
        this.low = low;
    }

    private static void setAdapterAddress()
        throws Exception
    {
        try
        {
            byte addr[] = InetAddress.getLocalHost().getAddress();
            int raw = addr[3] & 0xff | addr[2] << 8 & 0xff00 | addr[1] << 16 & 0xff0000 | addr[0] << 24 & 0xff000000;
            adapterAddress = (long)raw & 0xffffffffL;
        }
        catch(UnknownHostException e)
        {
            throw new Exception("Unexpected failure");
        }
    }

    private static void setTimeStamp()
        throws Exception
    {
        acquireHostLock();
        try
        {
            long newTime = System.currentTimeMillis();
            if(timeStamp != 0L)
            {
                if(newTime < timeStamp)
                    throw new Exception("Unique identifier clock failure");
                if(newTime == timeStamp)
                {
                    letClockTick(newTime);
                    newTime = System.currentTimeMillis();
                }
            }
            timeStamp = newTime;
        }
        finally
        {
            releaseHostLock();
        }
        return;
    }

    private static void letClockTick(long curTime)
        throws Exception
    {
        int timeoutCounter = 0;
        long sleepTime = 1L;
        for(long newTime = System.currentTimeMillis(); newTime == curTime; newTime = System.currentTimeMillis())
        {
            timeoutCounter++;
            sleepTime *= 2L;
            try
            {
                Thread.sleep(sleepTime);
            }
            catch(InterruptedException interruptedexception) { }
            if(sleepTime > 60000L)
                throw new Exception("Unique identifier unexpected failure");
        }

    }

    private static void acquireHostLock()
        throws Exception
    {
        String portProperty = null;
        try
        {
            portProperty = System.getProperty("bluewater.uuid.hostLockPort");
        }
        catch(SecurityException securityexception) { }
        if(portProperty != null)
            try
            {
                UUID_HOST_LOCK_PORT = Integer.parseInt(portProperty);
            }
            catch(NumberFormatException numberformatexception) { }
        for(int numberOfRetrys = 0; lockSocket == null; numberOfRetrys++)
        {
            try
            {
                lockSocket = new ServerSocket(UUID_HOST_LOCK_PORT);
                return;
            }
            catch(BindException bindexception) { }
            catch(IOException e2)
            {
                throw new Exception("Unique identifier unexpected failure");
            }
            try
            {
                Thread.sleep(100L);
            }
            catch(InterruptedException interruptedexception) { }
            if(numberOfRetrys == 1200)
                throw new Exception("Unique identifier lock failure");
        }

    }

    private static void releaseHostLock()
    {
        if(lockSocket != null)
        {
            try
            {
                lockSocket.close();
            }
            catch(IOException ioexception) { }
            lockSocket = null;
        }
    }

    public boolean equals(Object obj)
    {
        if(obj != null && (obj instanceof Uuid))
            return high == ((Uuid)obj).high && low == ((Uuid)obj).low;
        else
            return false;
    }

    public int hashCode()
    {
        return (int)(low << 24) & 0xff000000 | (int)(high >> 20) & 0xfff000 | (int)(low >> 32) & 0xfff;
    }

    public String toString()
    {
        if(str36 != null)
        {
            return str36;
        } else
        {
            StringBuffer buf = new StringBuffer();
            buf.append(toHexString(high >>> 32, 8));
          //  buf.append(toHexString(high >>> 16, 4));
          //  buf.append(toHexString(high, 4));
          //  buf.append(toHexString(low >>> 48, 4));
            buf.append(toHexString(low>>>24, 8));
            str36 = buf.toString();           
           
            return str36;
        }
    }

    private static String toHexString(long x, int chars)
    {
        char buf[] = new char[chars];
        for(int charPos = chars; --charPos >= 0;)
        {
            buf[charPos] = hexDigits[(int)(x & 15L)];
            x >>>= 4;
        }

        return new String(buf);
    }

    public byte[] toByteArray()
    {
        byte array[] = new byte[16];
        toBytes(high, array, 0);
        toBytes(low, array, 8);
        return array;
    }

    private void toBytes(long x, byte array[], int startPos)
    {
        for(int bytePos = 8; --bytePos >= 0;)
        {
            array[startPos + bytePos] = (byte)(int)(x & 255L);
            x >>>= 8;
        }

    }

    public void write(DataOutput out)
        throws IOException
    {
        out.writeLong(high);
        out.writeLong(low);
    }

    public static Uuid read(DataInput in)
        throws IOException
    {
        long high = in.readLong();
        long low = in.readLong();
        return new Uuid(high, low);
    }

    public static Uuid read(String id)
        throws Exception
    {
        String part = id.substring(0, 8);
        long high = 0L;
        high = Long.parseLong(part, 16) << 32;
        part = id.substring(9, 13);
        high |= Long.parseLong(part, 16) << 16;
        part = id.substring(14, 18);
        high |= Long.parseLong(part, 16);
        long low = 0L;
        part = id.substring(19, 23);
        low = Long.parseLong(part, 16) << 48;
        part = id.substring(24, 36);
        low |= Long.parseLong(part, 16);
        Uuid uuid = new Uuid(high, low);
        return uuid;
    }

    public static void main(String args[])
    {
        try
        {
            //long begin = System.currentTimeMillis();
            //String[] str=null;
           // ArrayList a=new ArrayList();
           // String var;
            //String d="2006/01/01";
            //java.util.Date datetime = new java.util.Date();
            java.text.SimpleDateFormat smpDate = new java.text.SimpleDateFormat("yyyy-MM-dd");
            java.util.Date d=java.sql.Date.valueOf("2006-12-0223");
            String datebuf = smpDate.format(d);
           
           
            System.out.println("datetime="+datebuf);
           /* for(int i = 0; i < 30; i++)
            {
                Uuid uuid = create();  
                String uid=uuid.toString();
                System.out.println("aaaaa-----"+uid);
              
             /*   Iterator it =   a.iterator();
               while(it.hasNext()){
                 var=(String)it.next();
                // System.out.println("aaaaa-----"+var);
                 if (var==uuid.toString())
                  System.out.print("true");
                 
                }
                a.add(uuid.toString());*/
           //}

           /* long end = System.currentTimeMillis();
            System.out.println("total=" + (end - begin) + "ms," + (end - begin) / 1000L + " second");*/
         
        // System.out.print(id);*/
        } catch(Exception exception) { exception.printStackTrace();}
    }
   
   
    private long high;
    private long low;
    private transient String str36;
    private static int UUID_HOST_LOCK_PORT = 5504;
    //private static final int MAX_RETRYS = 1200;
    //private static final int INTERVAL_TIME = 100;
    private static ServerSocket lockSocket;
    private static long timeStamp;
    private static long adapterAddress;
    private static int instanceCounter;
    //private static final long versionMask = 4096L;
    //private static final long reserveMask = 0xe000000000000000L;
    //private static final long randomMask = 0x1fffffffL;
    private static final char hexDigits[] = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'a', 'b', 'c', 'd', 'e', 'f'
    };

}



上一篇:Java实现利用搜索引擎收集网址的程序
下一篇:JS实现DIV的增加和移动
用户名:新注册) 密码: 匿名评论 [所有评论]
评论内容:不能超过250字,请自觉遵守互联网相关政策法规。
本栏搜索

  • Google Chinesedocument.com
 网站首页 -  网站地图 -  技术论坛 -  网站投稿 -  广告服务 -  手机游戏
©2007 分享文档 Chinesedocument.com [京ICP备06000384号]