[Gradle] Hash MetadataDependencyTransformationTaskInputs to reduce CC size

Experiment: try hashing the inputs, so they don't take up so much space in CC.

^KT-72933
diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt
index 7a9b493..8a721f2 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/MetadataDependencyTransformationTaskInputs.kt
@@ -17,6 +17,7 @@
 import org.jetbrains.kotlin.utils.addToStdlib.applyIf
 import java.io.IOException
 import java.io.OutputStream
+import java.io.OutputStreamWriter
 import java.security.DigestOutputStream
 import java.security.MessageDigest
 import java.util.*
@@ -97,12 +98,23 @@
     @get:Input
     @Suppress("unused") // Gradle input
     val inputSourceSetsAndCompilationsChecksum: String by lazy {
-        val inputSourceSetsAndCompilations: Map<String, Iterable<String>> =
-            participatingSourceSets.associate { sourceSet ->
-                sourceSet.name to sourceSet.internal.compilations.mapTo(sortedSetOf()) { it.name }
+        Hasher().use { hasher ->
+            participatingSourceSets.forEach { sourceSet ->
+                hasher.write(sourceSet.name)
+
+                hasher.write("[")
+                sourceSet.internal.compilations
+                    .mapTo(sortedSetOf()) { it.name }
+                    .forEach { name ->
+                        hasher.write(name)
+                        hasher.write(",")
+                    }
+
+                hasher.write("]")
             }
 
-        createChecksum(inputSourceSetsAndCompilations)
+            hasher.get()
+        }
     }
 
     @Suppress("unused") // Gradle input
@@ -113,29 +125,35 @@
     @get:Input
     @Suppress("unused") // Gradle input
     val inputCompilationDependenciesChecksum: String by lazy {
-        val inputCompilationDependencies: Map<String, Set<String>> =
+        Hasher().use { hasher ->
             participatingSourceSets
                 .flatMap { it.internal.compilations }
-                .associate { compilation ->
-                    val dependencies = project.configurations.getByName(compilation.compileDependencyConfigurationName)
+                .forEach { compilation ->
+                    hasher.write(compilation.name)
+                    hasher.write("[")
+                    project.configurations.getByName(compilation.compileDependencyConfigurationName)
                         .allDependencies
-                        .mapTo(mutableSetOf()) { dependency ->
+                        .forEach { dependency ->
                             if (dependency is ProjectDependency && keepProjectDependencies) {
                                 if (GradleVersion.current() < GradleVersion.version("8.11")) {
                                     @Suppress("DEPRECATION")
-                                    dependency.dependencyProject.path
+                                    hasher.write(dependency.dependencyProject.path)
                                 } else {
-                                    dependency.path
+                                    hasher.write(dependency.path)
                                 }
                             } else {
-                                dependency.run { "${name}:${group}:${version}" }
+                                hasher.write(dependency.name)
+                                hasher.write(":")
+                                hasher.write(dependency.group ?: "")
+                                hasher.write(":")
+                                hasher.write(dependency.version ?: "")
                             }
+                            hasher.write(",")
                         }
-
-                    compilation.name to dependencies
+                    hasher.write("]")
                 }
-
-        createChecksum(inputCompilationDependencies)
+            hasher.get()
+        }
     }
 
     private fun Configuration.withoutProjectDependencies(): FileCollection {
@@ -145,23 +163,22 @@
     }
 }
 
-private fun createChecksum(data: Map<String, Iterable<String>>): String {
-    val messageDigester = MessageDigest.getInstance("MD5")
-    DigestOutputStream(nullOutputStream(), messageDigester).writer().use { digestStream ->
-        with(digestStream) {
-            data.forEach { (k, v) ->
-                write("k:")
-                write(k)
-                write("values[")
-                v.forEach {
-                    write(it)
-                    write(",")
-                }
-                write("];")
-            }
-        }
+
+private class Hasher : AutoCloseable {
+    private val messageDigester = MessageDigest.getInstance("MD5")
+    private val writer: OutputStreamWriter = DigestOutputStream(nullOutputStream(), messageDigester).writer()
+
+    fun write(value: String) {
+        writer.write(value)
     }
-    return Base64.getEncoder().encodeToString(messageDigester.digest())
+
+    fun get(): String {
+        return Base64.getEncoder().encodeToString(messageDigester.digest())
+    }
+
+    override fun close() {
+        writer.close()
+    }
 }
 
 /** Replace with [OutputStream.nullOutputStream] when the minimum JDK is 11+. */