2009-12-05 7 views
4

GUID 목록을 (TGuid와 같이) 정렬하는 좋은 방법은 무엇입니까? 난 그냥 SysUtils.CompareMem (P1, P2 : 포인터, 길이 : 정수) : 부울; 내가 부울을 반환 할 때까지.GUID로 정렬 할 수 있도록 GUID를 비교할 수 있습니다.

정수를 반환하는 CompareText() 또는 CompareValue()와 비교할 수있는 것이 있으면 정렬 비교에 사용할 수 있기를 바랍니다.

많은 사람들이 GUID를 정렬하고 싶지는 않습니까? 어떤 아이디어입니까?

저는 TGuid 레코드의 내용에 대해 CompareValue()에 계단식 호출을 호출 할 수 있다고 가정합니다. 내 본능은 더 좋은 방법이 있어야한다고 말해 줬어!

감사합니다.

+1

왜 GUID별로 정렬하려고하는지 묻습니다. –

+0

Microsoft GUID (나는 당신이 말하는 것을 가정합니다)는 생성 시간에 따라 정렬됩니다. 이것은 매우 흥미로운 속성입니다. 동일한 머신에 속한 GUID의 경우 생성 시간별로 오더를 생성해야합니다. 또는 네트워크의 시스템이 잘 동기화되어 있다면이 방법으로 사용할 수 있습니다. 이것은 비 타임 스탬프 요소가 정렬에 사용되지 않는다는 것을 의미합니다. –

+1

Mike C. - 정렬 순서는 일반적인 알고리즘과 컬렉션에 매우 유용합니다. 균형 잡힌 성능을 필요로하는 컬렉션을 고려해보십시오 - 균형 잡힌 트리가 적합 할지라도 임의의 정렬 순서가 필요합니다. –

답변

14

Delphi 2009 이상을 사용하는 경우 TComparer<TGUID>.Compare() 또는 Generics.Defaults 유닛에서 호출하는 BinaryCompare 함수를 사용할 수 있습니다.

+0

매우 부드러운 배리 - 감사합니다! 나는 이것이 RTL에서 사용할 수있는 무언가가 있어야한다는 것을 알았다! –

2

델파이를 모르지만 일반적으로 GUID는 128-bit hexadecimal string입니다. 하위 요소를 부호없는 (4 * 4 바이트 또는 2 * 8 바이트) 정수로 캐스팅/파싱 한 다음 비교할 수 있습니다. 일단 그 함수가 있으면 표준 정렬 알고리즘을 적용하면됩니다.

내 대답이 GUID specification의 RFC를 만족하지 못하면 Microsoft에서 사용하는 방법을 사용하여 GUID의 비트 수준 추출 데이터를 정렬하는 더 좋은 방법을 생각해 낼 수 있습니다.

+0

이것은 문자열 비교가 너무 비싼 skamradt

0

GUIDToString을 사용하고 가장 빠른 옵션이 아닌 CompareStr을 사용하면 작동합니다.

+0

아야 ... 문자열 비교는 매우 비쌉니다. TGUID 요소를 개별적으로 정렬하거나 [1..8] 정수 배열로 캐스팅하고 arl을 비교하는 것이 더 좋습니다 – skamradt

-3
Function CompareGUIDS(pvGUID1, pvGUID2 : TGUID) : Boolean; 
Begin 
    If (pvGUID1.D1 = pvGUID2.D1) And 
     (pvGUID1.D2 = pvGUID2.D2) And 
     (pvGUID1.D3 = pvGUID2.D3) And 
     (pvGUID1.D4[ 0 ] = pvGUID2.D4[ 0 ]) And 
     (pvGUID1.D4[ 1 ] = pvGUID2.D4[ 1 ]) And 
     (pvGUID1.D4[ 2 ] = pvGUID2.D4[ 2 ]) And 
     (pvGUID1.D4[ 3 ] = pvGUID2.D4[ 3 ]) And 
     (pvGUID1.D4[ 4 ] = pvGUID2.D4[ 4 ]) And 
     (pvGUID1.D4[ 5 ] = pvGUID2.D4[ 5 ]) And 
     (pvGUID1.D4[ 6 ] = pvGUID2.D4[ 6 ]) And 
     (pvGUID1.D4[ 7 ] = pvGUID2.D4[ 7 ]) Then 
     Result := True 
    Else 
     Result := False; 
End; 
+0

X-Ray는 GUID를 비교하는 함수 (같음,보다 큼,보다 작음)를 찾고있었습니다. GUID와 일치하는 함수가 아닙니다. –

관련 문제