PureBasic
PureBasic
Dropbox Content Hash
See more Dropbox Examples
Demonstrates how to compute the Dropbox content_hash of a file. (This is the "content_hash" found in the Dropbox FileMetadata object.Note: This example requires Chilkat v9.5.0.79 or greater because it uses the fac.ReadBlockBd method.
Chilkat PureBasic Downloads
IncludeFile "CkBinData.pb"
IncludeFile "CkFileAccess.pb"
IncludeFile "CkCrypt2.pb"
Procedure ChilkatExample()
success.i = 0
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
crypt.i = CkCrypt2::ckCreate()
If crypt.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; To calculate the content_hash of a file:
; Split the file into blocks of 4 MB (4,194,304 or 4 * 1024 * 1024 bytes). The last block (if any) may be smaller than 4 MB.
; Compute the hash of each block using SHA-256.
; Concatenate the hash of all blocks in the binary format to form a single binary string.
; Compute the hash of the concatenated string using SHA-256. Output the resulting hash in hexadecimal format.
CkCrypt2::setCkHashAlgorithm(crypt, "sha256")
CkCrypt2::setCkEncodingMode(crypt, "hex_lower")
; We're going to calculate the content_hash for the Milky Way JPG image linked here: https://www.dropbox.com/developers/reference/content-hash
fac.i = CkFileAccess::ckCreate()
If fac.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
bd.i = CkBinData::ckCreate()
If bd.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
bdHashes.i = CkBinData::ckCreate()
If bdHashes.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
success = CkFileAccess::ckOpenForRead(fac,"qa_data/jpg/milky-way-nasa.jpg")
If success = 0
Debug CkFileAccess::ckLastErrorText(fac)
CkCrypt2::ckDispose(crypt)
CkFileAccess::ckDispose(fac)
CkBinData::ckDispose(bd)
CkBinData::ckDispose(bdHashes)
ProcedureReturn
EndIf
blockSize.i = 4194304
numBlocks.i = CkFileAccess::ckGetNumBlocks(fac,blockSize)
i.i = 0
While (i < numBlocks)
; Read the next 4MB block into bd.
CkBinData::ckClear(bd)
success = CkFileAccess::ckReadBlockBd(fac,i,blockSize,bd)
hashHex.s = CkCrypt2::ckHashBdENC(crypt,bd)
Debug Str(i) + ": " + hashHex
CkBinData::ckAppendEncoded(bdHashes,hashHex,"hex_lower")
i = i + 1
Wend
CkFileAccess::ckFileClose(fac)
; Hash the concatenated SHA-256 hashes.
content_hash.s = CkCrypt2::ckHashBdENC(crypt,bdHashes)
Debug "content_hash = " + content_hash
CkCrypt2::ckDispose(crypt)
CkFileAccess::ckDispose(fac)
CkBinData::ckDispose(bd)
CkBinData::ckDispose(bdHashes)
ProcedureReturn
EndProcedure