Можно перевести массив в строку, или лучше в хеш сумму, и их сравнивать.
a := ["123", "123", "123", "222"]
b := ["123", "123", "123", "222"]
MsgBox % ObjToBase64(a) = ObjToBase64(b)
ObjToBase64(obj) {
If !IsObject(obj)
Return
VarSetCapacity(Bin, Size := RawObjectSize(obj, 0) + 8, 0)
RawObject(obj, NumPut(Size - 8, 0 + (addr := &Bin), "Int64"), 0)
DllCall("Crypt32.dll\CryptBinaryToString"
, Ptr, addr, UInt, Size, UInt, 0x00000001|0x40000000, UInt, 0, UIntP, TChars, "CDECL Int")
VarSetCapacity(Base64, Req := TChars * (A_IsUnicode ? 2 : 1 ))
DllCall("Crypt32.dll\CryptBinaryToString"
, Ptr, addr, UInt, Size, UInt, 0x00000001|0x40000000, Str, Base64, UIntP, Req, "CDECL Int")
Return Base64
}
RawObject(obj, addr, buf := 0, objects := 0) {
; Type.Enum: Char.1 UChar.2 Short.3 UShort.4 Int.5 UInt.6 Int64.7 UInt64.8 Double.9 String.10 Object.11
; Negative for keys and positive for values
if !objects
objects:={(""):0,(obj):0}
else objects[obj]:=(++objects[""])
for k,v in obj
{ ; 9 = Int64 for size and Char for type
If IsObject(k){
If objects.HasKey(k)
NumPut(-12,addr+0,"Char"),NumPut(objects[k],addr+1,"Int64"),addr+=9
else NumPut(-11,addr+0,"Char"),NumPut(sz:=RawObjectSize(k,buf),addr+1,"Int64"),RawObject(k,addr+9,buf,objects),addr+=sz+9
}else if (k+0="")
NumPut(-10,addr+0,"Char"),NumPut(sz:=StrPut(k,addr+9)*2,addr+1,"Int64"),addr+=sz+9
else NumPut( InStr(k,".")?-9:k>4294967295?-8:k>65535?-6:k>255?-4:k>-1?-2:k>-129?-1:k>-32769?-3:k>-2147483649?-5:-7,addr+0,"Char")
,NumPut(k,addr+1,InStr(k,".")?"Double":k>4294967295?"UInt64":k>65535?"UInt":k>255?"UShort":k>-1?"UChar":k>-129?"Char":k>-32769?"Short":k>-2147483649?"Int":"Int64")
,addr+=InStr(k,".")||k>4294967295?9:k>65535?5:k>255?3:k>-129?2:k>-32769?3:k>-2147483649?5:9
If IsObject(v){
if objects.HasKey(v)
NumPut( 12,addr+0,"Char"),NumPut(objects[v],addr+1,"Int64"),addr+=9
else NumPut( 11,addr+0,"Char"),NumPut(sz:=RawObjectSize(v,buf),addr+1,"Int64"),RawObject(v,addr+9,buf,objects),addr+=sz+9
}else if (v+0="")
NumPut( 10,addr+0,"Char"),NumPut(sz:=buf?obj.GetCapacity(k):StrPut(v)*2,addr+1,"Int64"),DllCall("RtlMoveMemory","PTR",addr+9,"PTR",buf?obj.GetAddress(k):&v,"PTR",sz),addr+=sz+9
else NumPut(InStr(v,".")?9:v>4294967295?8:v>65535?6:v>255?4:v>-1?2:v>-129?1:v>-32769?3:v>-2147483649?5:7,addr+0,"Char")
,NumPut(v,addr+1,InStr(v,".")?"Double":v>4294967295?"UInt64":v>65535?"UInt":v>255?"UShort":v>-1?"UChar":v>-129?"Char":v>-32769?"Short":v>-2147483649?"Int":"Int64")
,addr+=InStr(v,".")||v>4294967295?9:v>65535?5:v>255?3:v>-129?2:v>-32769?3:v>-2147483649?5:9
}
}
RawObjectSize(obj,buf:=0,objects:=0){
if !objects
objects:={(obj):1}
else if !objects.HasKey(obj)
objects[obj]:=1
for k,v in obj
{
If IsObject(k)
sz+=objects.HasKey(k)?9:RawObjectSize(k,buf,objects)+9
else if (k+0="")
sz+=StrPut(k)*2+9
else sz+=InStr(k,".")||k>4294967295?9:k>65535?5:k>255?3:k>-129?2:k>-32769?3:k>-2147483649?5:9
If IsObject(v)
sz+=objects.HasKey(v)?9:RawObjectSize(v,buf,objects)+9
else if (v+0="")
sz+=(buf?obj.GetCapacity(k):StrPut(v)*2)+9
else sz+=InStr(v,".")||v>4294967295?9:v>65535?5:v>255?3:v>-129?2:v>-32769?3:v>-2147483649?5:9
}
return sz
}
С хэшем:
a := ["123", "123", "123", "222"]
b := ["123", "123", "123", "222"]
MsgBox % ObjToMD5Hash(a) = ObjToMD5Hash(b)
ObjToMD5Hash(obj) {
If !IsObject(obj)
Return
VarSetCapacity(Bin, Size := RawObjectSize(obj, 0) + 8, 0)
RawObject(obj, NumPut(Size - 8, 0 + (addr := &Bin), "Int64"), 0)
Return CalcMD5Hash(addr, Size)
}
RawObject(obj, addr, buf := 0, objects := 0) {
; Type.Enum: Char.1 UChar.2 Short.3 UShort.4 Int.5 UInt.6 Int64.7 UInt64.8 Double.9 String.10 Object.11
; Negative for keys and positive for values
if !objects
objects:={(""):0,(obj):0}
else objects[obj]:=(++objects[""])
for k,v in obj
{ ; 9 = Int64 for size and Char for type
If IsObject(k){
If objects.HasKey(k)
NumPut(-12,addr+0,"Char"),NumPut(objects[k],addr+1,"Int64"),addr+=9
else NumPut(-11,addr+0,"Char"),NumPut(sz:=RawObjectSize(k,buf),addr+1,"Int64"),RawObject(k,addr+9,buf,objects),addr+=sz+9
}else if (k+0="")
NumPut(-10,addr+0,"Char"),NumPut(sz:=StrPut(k,addr+9)*2,addr+1,"Int64"),addr+=sz+9
else NumPut( InStr(k,".")?-9:k>4294967295?-8:k>65535?-6:k>255?-4:k>-1?-2:k>-129?-1:k>-32769?-3:k>-2147483649?-5:-7,addr+0,"Char")
,NumPut(k,addr+1,InStr(k,".")?"Double":k>4294967295?"UInt64":k>65535?"UInt":k>255?"UShort":k>-1?"UChar":k>-129?"Char":k>-32769?"Short":k>-2147483649?"Int":"Int64")
,addr+=InStr(k,".")||k>4294967295?9:k>65535?5:k>255?3:k>-129?2:k>-32769?3:k>-2147483649?5:9
If IsObject(v){
if objects.HasKey(v)
NumPut( 12,addr+0,"Char"),NumPut(objects[v],addr+1,"Int64"),addr+=9
else NumPut( 11,addr+0,"Char"),NumPut(sz:=RawObjectSize(v,buf),addr+1,"Int64"),RawObject(v,addr+9,buf,objects),addr+=sz+9
}else if (v+0="")
NumPut( 10,addr+0,"Char"),NumPut(sz:=buf?obj.GetCapacity(k):StrPut(v)*2,addr+1,"Int64"),DllCall("RtlMoveMemory","PTR",addr+9,"PTR",buf?obj.GetAddress(k):&v,"PTR",sz),addr+=sz+9
else NumPut(InStr(v,".")?9:v>4294967295?8:v>65535?6:v>255?4:v>-1?2:v>-129?1:v>-32769?3:v>-2147483649?5:7,addr+0,"Char")
,NumPut(v,addr+1,InStr(v,".")?"Double":v>4294967295?"UInt64":v>65535?"UInt":v>255?"UShort":v>-1?"UChar":v>-129?"Char":v>-32769?"Short":v>-2147483649?"Int":"Int64")
,addr+=InStr(v,".")||v>4294967295?9:v>65535?5:v>255?3:v>-129?2:v>-32769?3:v>-2147483649?5:9
}
}
RawObjectSize(obj,buf:=0,objects:=0){
if !objects
objects:={(obj):1}
else if !objects.HasKey(obj)
objects[obj]:=1
for k,v in obj
{
If IsObject(k)
sz+=objects.HasKey(k)?9:RawObjectSize(k,buf,objects)+9
else if (k+0="")
sz+=StrPut(k)*2+9
else sz+=InStr(k,".")||k>4294967295?9:k>65535?5:k>255?3:k>-129?2:k>-32769?3:k>-2147483649?5:9
If IsObject(v)
sz+=objects.HasKey(v)?9:RawObjectSize(v,buf,objects)+9
else if (v+0="")
sz+=(buf?obj.GetCapacity(k):StrPut(v)*2)+9
else sz+=InStr(v,".")||v>4294967295?9:v>65535?5:v>255?3:v>-129?2:v>-32769?3:v>-2147483649?5:9
}
return sz
}
CalcMD5Hash(addr, length) {
Static PROV_RSA_AES := 24, CRYPT_VERIFYCONTEXT := 0xF0000000, HP_HASHVAL := 0x0002, hash := 0, hashlength := 0, hProv := 1
if (DllCall("advapi32\CryptAcquireContext", PtrP, hProv, Ptr, 0, Ptr, 0, UInt, PROV_RSA_AES, UInt, CRYPT_VERIFYCONTEXT))
if (DllCall("advapi32\CryptCreateHash", Ptr, hProv, UInt, 32771, UInt, 0, UInt, 0, "Ptr*", hHash)) ; CALG_MD5 := 32771
if (DllCall("advapi32\CryptHashData", Ptr, hHash, Ptr, addr, UInt, length, UInt, 0))
if (DllCall("advapi32\CryptGetHashParam", Ptr, hHash, UInt, HP_HASHVAL, Ptr, 0, UIntP, hashlength, UInt, 0)) {
VarSetCapacity(hash, hashlength, 0)
if (DllCall("advapi32\CryptGetHashParam", Ptr, hHash, UInt, HP_HASHVAL, Ptr, &hash, UIntP, hashlength, UInt, 0))
Loop % hashlength
hashstr .= Format("{:02X}", *(&hash + A_Index - 1))
}
DllCall("advapi32\CryptDestroyHash", Ptr, hHash), DllCall("advapi32\CryptReleaseContext", Ptr, hProv, UInt, 0)
Return hashstr
}
По вопросам возмездной помощи пишите на
E-Mail: serzh82saratov@mail.ru Telegram:
https://t.me/sergiol982Win10x64
AhkSpy,
Hotkey,
ClockGui