| > 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(10个0),但这样会可能发生溢出 //如果采用int64,则会给下面的移位转换带来麻烦 //所以这里采用了1000000000(9个0) //这里的算法是采用的是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] 下一页 |