in services/glacier/common/src/aws/sdk/kotlin/services/glacier/internal/TreeHasher.kt [40:72]
override suspend fun calculateHashes(body: HttpBody): Hashes {
val full = hashSupplier()
val hashTree = ArrayDeque<ByteArray>()
body.chunks().collect { chunk ->
full.update(chunk)
hashTree.addLast(chunk.hash())
}
if (hashTree.isEmpty()) {
// Edge case for empty bodies
hashTree.add(byteArrayOf().hash())
}
while (hashTree.size > 1) {
val nextRow = mutableListOf<ByteArray>()
while (hashTree.isNotEmpty()) {
if (hashTree.size == 1) {
nextRow.add(hashTree.removeFirst())
} else {
val hash = hashSupplier()
hashTree.removeFirst().let(hash::update)
hashTree.removeFirst().let(hash::update)
nextRow.add(hash.digest())
}
}
hashTree.addAll(nextRow)
}
return Hashes(full.digest(), hashTree.first())
}