override suspend fun calculateHashes()

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())
    }