打印本文 打印本文 关闭窗口 关闭窗口
Integer GUID和Comb做主键的效率测试(Delphi+access)(一)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3493  更新时间:2009/4/23 18:25:46  文章录入:mintao  责任编辑:mintao
>

      raise Exception.Create(''''Create GUID Err!'''');

   end;

end;

 

class function SSystem.GetCombGUID(guid: TGUID): TGUID;

var

  dtm : TDateTime;

  days,seconds,tmp : longint;//32 bit

begin

   dtm := Now();

   dtm := dtm - spdelib_base_datetime;

   days := trunc(dtm);

   //应该*1000000000(100),但这样会可能发生溢出

   //如果采用int64,则会给下面的移位转换带来麻烦

   //所以这里采用了1000000000(90)

   //这里的算法是采用的是Jimmy Nilsson''''The Const of GUIDs as Primary Keys''''

   //算法,对于实时性要求不太高的系统来说,可以采用3/3,

   //3个字节存放日期,3个字节存放时间,这里是2/4

   seconds := trunc(( dtm - days ) * 1000000000);

 

   //高位在前

   //整数部分(日期部分)

   tmp := days and $FF;

   guid.D4[3] := byte(tmp);

   tmp := (days shr 8);

   guid.D4[2] := byte(tmp);

 

   //小数部分(时间部分)

   tmp := seconds and $FF000000;

   tmp := tmp shr 24;

   guid.D4[4] := byte(tmp);

 

   tmp := seconds and $00FF0000;

   tmp := tmp shr 16;

   guid.D4[5] := byte(tmp);

 

   tmp := seconds and $0000FF00;

   tmp := tmp shr 8;

   guid.D4[6] := byte(tmp);

 

   tmp := seconds and $000000FF;

   guid.D4[7] := byte(tmp);

 

   Result := guid;

end;

 

class function SSystem.GetDateTimeFromCombGuid(guid: TGUID): TDateTime;

var

 days,seconds : longint;//32 bit

begin

  days := guid.D4[2];

  days := days shl 8;

  days := days + guid.D4[3];

  days := days + trunc(spdelib_base_datetime);

 

  seconds := guid.D4[4];

  seconds := seconds shl 8;

  seconds := seconds + guid.D4[5];

  seconds := (seconds shl 8) + guid.D4[6];

  seconds := (seconds shl 8) + guid.D4[7];

  result := seconds / 1000000000;

 

  result :=days + result;

end;

 

class function SSystem.GetGuidString(guid: TGUID; beginSymbol, endSymbol,

  partitionSymbol: string): string;

begin

 

上一页  [1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口