雜湊與 ETag:最佳做法

Cloud Storage 建議使用者使用 CRC32c 或 MD5 總和檢查碼,來驗證傳入或傳出值區的資料。本節將說明執行這些驗證作業的最佳做法。

使用雜湊執行完整性檢查

在 Cloud 中,有多種原因可能造成資料在上傳或下載過程中毀損:

  • 網路連結有雜訊
  • 用戶端、伺服器電腦或路由器的路徑上發生記憶體錯誤
  • 軟體錯誤 (例如:在客戶使用的程式庫中)

為了防止資料毀損,Cloud Storage 支援兩種雜湊:CRC32C 和 MD5 (說明如下)。Google 建議客戶一律使用 CRC32C,並遵循下面「驗證」一節的說明。偏好採用 MD5 的客戶可使用這種雜湊,只是這種雜湊無法用於複合物件。

CRC32C

所有的 Cloud Storage 物件都有 CRC32c 雜湊碼。CRC32C 是採用 Castagnoli 多項式為基礎的 32 位元循環冗餘檢查 (CRC)。SCTP 適用的 IETF 規格提供這項 CRC 的說明,用於計算 CRC32c 的程式庫包括 Google 的 CRC32C 和 C++ 適用的 Boost、Python 適用的 crcmod,以及 Ruby 適用的 digest-crc。Java 使用者可在 GoogleCloudPlatform crc32c Java 專案中找到演算法的實作。

Base64 編碼的 CRC32c 採用大端序的位元組順序。

MD5

Cloud Storage 支援非複合物件使用 MD5 雜湊。此雜湊只適用於完整物件,因此對於執行範圍 GET 所進行的局部下載作業,將不能使用這個雜湊來執行完整性檢查。

ETag

過去,物件的 MD5 會透過 ETag 標頭來表示。對 XML API 中的非複合物件來說,仍會沿用這樣的行為,但複合物件並不支援 MD5 雜湊,因此使用者不應採用這些 ETag,但只要基礎資料改變時,ETag 也會按照規格跟著改變。

驗證

對下載的資料即時進行雜湊運算,並將結果與伺服器提供的雜湊進行比較,即可執行下載項目的完整性檢查。下載的資料如果含有錯誤的雜湊值,應予以捨棄,然後使用重試邏輯,以避免可能所費不貲的無限迴圈。

Cloud Storage 支援上傳作業的伺服器端驗證,但用戶端驗證也是常見的方法。如果您的應用程式先完成物件的 MD5 或 CRC32c 運算後再開始上傳作業,就可以隨上傳要求一起提供雜湊,Cloud Storage 只有在您提供的雜湊與我們計算出的值吻合時,才會建立物件。

使用者也可選擇執行用戶端驗證,做法是發出對新物件中繼資料的要求,然後比較回報的雜湊值,並在出現不吻合時刪除物件。為避免獨立程序刪除或覆寫彼此資料的競爭狀況發生,我們也建議您使用物件產生版本和先決條件

如果是使用物件組合的平行上傳,使用者應對每個組成元件的上傳執行完整性檢查,接著在組合要求中使用組成元件先決條件,來防止發生競爭狀況。物件組合不提供伺服器端 MD5 驗證,所以使用者如果想執行端對端完整性檢查的話,就必須將用戶端驗證套用至新的複合物件。

完成每個複製作業後,gsutil cprsync 指令會驗證本機檔案的總和檢查碼是否與儲存在 Cloud Storage 的物件總和檢查碼吻合。如果不吻合,gsutil 會刪除無效複本並輸出警告訊息,但這種情況極少發生。萬一發生了,您可以再試一次。

XML API

XML API 會透過 x-goog-hash 標頭顯示及接受 base64 編碼的 MD5 和 CRC32c 雜湊。過去,MD5 被當成物件 ETag 使用,但我們建議使用者避免採用這個方法,因為複合物件會使用無法解讀的 ETag 值,而除了物件變更時 ETag 會隨著變更之外,無法提供其他保證。

您可以透過 x-goog-hash 要求標頭提供本機計算出的雜湊,藉此執行伺服器端的上傳驗證。此外,使用標準 HTTP Content-MD5 標頭也可以提供 MD5 (請參閱規格)。

JSON API

在 JSON API 中,物件資源 md5Hashcrc32c 屬性分別含有 base64 編碼的 MD5 和 CRC32c 雜湊。您可以自行選擇是否提供這兩種中繼資料屬性。如果物件 insert 中未提供屬性時,Cloud Storage 會計算屬性值並將其寫入物件的中繼資料。透過 insert 要求提供任一個屬性時,將會觸發新物件的伺服器端驗證。如果 Cloud Storage 對任一屬性計算出的值與提供的值不吻合,就不會建立物件。對於支援續傳的上傳作業和多部分上傳作業,使用 md5Hashcrc32c 屬性的方式與單一物件 insert 的方式相同。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Storage
需要協助嗎?請前往我們的支援網頁