一、Win10 32位和64位的區別
Win10的32位和64位,都可以在同一套硬體上運行。二者的差異在於可定址的內存空間不同,32位操作系統的最大可定址內存為4GB,而64位的操作系統則達到了2^64=16EB。
換言之,雖然現在的主流CPU支持多線程,卻沒有多達數百上千個線程同時運行的環境,因而相對於可定址內存空間增長的速度,程序的運行效率並沒有取得飛躍式的提高。
同時,64位的操作系統在處理浮點數時會更加準確,在計算機繪圖、信號處理、科學計算、人工智慧等領域都有更強的處理能力。而32位的操作系統在處理較小的應用程序時,相對於64位操作系統有更快的速度和更好的兼容性。
二、MD516位和32位的區別
MD516位和32位的區別在於可定址的內存空間不同。MD516位的程序最多只能定址2^16個內存單元,也即64K,而32位的程序可以定址2^32個內存單元,大概在4GB左右。
這帶來的直接結果是在MD5上,我們並不能使用較大的內存空間來存儲更大規模的數據,而32位可以通過操作系統調用的方式來分配更大的內存空間從而提高程序的性能。不過相對於MD516位,MD532位的程序佔用的空間也更大,需要更高的運算速度和內存空間。
三、MD516位與32位實現MD5演算法的代碼示例
MD516位實現示例代碼:
#include
#include
#define md5_size 16
typedef uint8_t byte;
typedef uint32_t word;
word X[] =
{
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
word A = 0x67452301;
word B = 0xefcdab89;
word C = 0x98badcfe;
word D = 0x10325476;
void md5(byte *data, size_t len, byte *result)
{
word X[16];
memcpy(X, data, len);
X[len/4] |= 0x80;
X[(len+8)/4] = len*8;
len += 8;
for(int i=0; i<len; i+=64)
{
word AA = A;
word BB = B;
word CC = C;
word DD = D;
for(int j=0; j<64; ++j)
{
word f, k, r;
if (j < 16)
{
f = (B & C) | ((~B) & D);
k = 0x00000000;
r = j;
}
else if (j < 32)
{
f = (D & B) | ((~D) & C);
k = 0x5a827999;
r = (5*j + 1) % 16;
}
else if (j < 48)
{
f = B ^ C ^ D;
k = 0x6ed9eba1;
r = (3*j + 5) % 16;
}
else if (j < 64)
{
f = C ^ (B | (~D));
k = 0x8f1bbcdc;
r = (7*j) % 16;
}
word ff = (A + f + k + X[r]);
A = D;
D = C;
C = B;
B = B + ((ff <> (32 - j % 32)));
}
A += AA;
B += BB;
C += CC;
D += DD;
}
memcpy(result, &A, 4);
memcpy(result+4, &B, 4);
memcpy(result+8, &C, 4);
memcpy(result+12, &D, 4);
}
MD532位實現示例代碼:
#include
#include
#define md5_size 16
typedef uint8_t byte;
typedef uint32_t word;
word X[] =
{
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
word A = 0x67452301;
word B = 0xefcdab89;
word C = 0x98badcfe;
word D = 0x10325476;
void md5(byte *data, size_t len, byte *result)
{
word X[16];
memcpy(X, data, len);
X[len/4] |= 0x80;
X[(len+8)/4] = len*8;
len += 8;
for(int i=0; i<len; i+=64)
{
word AA = A;
word BB = B;
word CC = C;
word DD = D;
for(int j=0; j<64; ++j)
{
word f, k, r;
if (j < 16)
{
f = (B & C) | ((~B) & D);
k = 0x00000000;
r = j;
}
else if (j < 32)
{
f = (D & B) | ((~D) & C);
k = 0x5a827999;
r = (5*j + 1) % 16;
}
else if (j < 48)
{
f = B ^ C ^ D;
k = 0x6ed9eba1;
r = (3*j + 5) % 16;
}
else if (j < 64)
{
f = C ^ (B | (~D));
k = 0x8f1bbcdc;
r = (7*j) % 16;
}
word ff = (A + f + k + X[r]);
A = D;
D = C;
C = B;
B = B + ((ff <> (32 - j % 32)));
}
A += AA;
B += BB;
C += CC;
D += DD;
}
memcpy(result, &A, 4);
memcpy(result+4, &B, 4);
memcpy(result+8, &C, 4);
memcpy(result+12, &D, 4);
}
四、結語
總的來說,MD516位與32位的區別在於可定址內存空間不同。相比於MD516位,MD532位可以處理更大規模的數據,但也需要更高的運算速度和內存空間。不同的應用場景需要不同的演算法和優化方式。我們需要根據實際情況選擇合適的方案,才能使程序達到最佳的性能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183089.html