Sha-256
每種語言的 SHA256 實現是否為相同的值提供不同的結果
由於缺乏理解,這可能是一個非常幼稚的問題,但我正在觀看 Andreas M. Antonopoulos 關於區塊鏈、比特幣和共識算法的影片,他要求提供字元串的 SHA-256 輸出
Hello!
。一個人告訴他前幾個字元,作為 Windows/C# 開發人員,我決定只是為了好玩來檢查實現這個非常簡單的 C# 方法的答案:public byte[] Generate(string valueToHash) { byte[] hashValue; byte[] stringToBytes = Encoding.ASCII.GetBytes(valueToHash); using (SHA256 hashGenerator = SHA256.Create()) { hashValue = hashGenerator.ComputeHash(stringToBytes); } return hashValue; }
然後使用此方法輸出結果:
public static void PrintByteArray(byte[] array) { for (int i = 0; i < array.Length; i++) { Console.Write($"{array[i]:X2}"); if ((i % 4) == 3) Console.Write(" "); } Console.WriteLine(); }
但我得到了不同的結果。
我記得過去有些網站儲存了大量的雜湊數據庫和生成它們的實際值,然後可以粘貼雜湊值,如果它很常見,您將獲得實際的字元串。這讓我想到,無論您使用什麼語言/作業系統,例如使用 SHA-256 散列的值都會產生相同的結果。然而,情況似乎並非完全如此。影片中提供答案的人(來自評論)使用 Mac 機器,那麼究竟是什麼導致 SHA-256 為相同的輸入產生不同的輸出?是作業系統,還是程式語言?也許我在簡單的程式碼中犯了錯誤?
是的,SHA-256被定義為在每個平台上為相同的輸入字節序列提供相同的輸出。然而,根據設計,即使輸入的最小變化也會將輸出改變為完全不同的東西。因此,您觀察到的差異最可能的原因是您使用的輸入實際上與影片的原始輸入不同。
造成這種差異的一些可能原因可能包括: