MD516位和32位區別詳解

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 16:26
下一篇 2024-11-24 16:26

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字元命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟體開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • TensorFlow和Python的區別

    TensorFlow和Python是現如今最受歡迎的機器學習平台和編程語言。雖然兩者都處於機器學習領域的主流陣營,但它們有很多區別。本文將從多個方面對TensorFlow和Pyth…

    編程 2025-04-28
  • 麥語言與Python的區別

    麥語言和Python都是非常受歡迎的編程語言。它們各自有自己的優缺點和適合的應用場景。本文將從語言特性、語法、生態系統等多個方面,對麥語言和Python進行詳細比較和闡述。 一、語…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • Python與C語言的區別和聯繫

    Python與C語言是兩種常用的編程語言,雖然兩者都可以用於編寫軟體程序,但是它們之間有很多不同之處。本文將從多個方面對Python與C語言的區別和聯繫進行詳細的闡述。 一、語法特…

    編程 2025-04-28
  • Python中深拷貝和淺拷貝的區別

    本文將從以下幾個方面對Python中深拷貝和淺拷貝的區別做詳細的闡述,包括:拷貝的含義、變數和對象的區別、淺拷貝的示例、深拷貝的示例、可變對象和不可變對象的區別、嵌套的數據結構以及…

    編程 2025-04-28

發表回復

登錄後才能評論