diff --git a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt index 940ed15f39f..fdbdc368349 100644 --- a/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt +++ b/libraries/tools/kotlin-main-kts/src/org/jetbrains/kotlin/mainKts/scriptDef.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.mainKts import kotlinx.coroutines.runBlocking import org.jetbrains.kotlin.mainKts.impl.IvyResolver import java.io.File +import java.nio.ByteBuffer import java.security.MessageDigest import kotlin.script.dependencies.ScriptContents import kotlin.script.dependencies.ScriptDependenciesResolver @@ -36,6 +37,7 @@ abstract class MainKtsScript(val args: Array) const val COMPILED_SCRIPTS_CACHE_DIR_ENV_VAR = "KOTLIN_MAIN_KTS_COMPILED_SCRIPTS_CACHE_DIR" const val COMPILED_SCRIPTS_CACHE_DIR_PROPERTY = "kotlin.main.kts.compiled.scripts.cache.dir" +const val COMPILED_SCRIPTS_CACHE_VERSION = 1 class MainKtsScriptDefinition : ScriptCompilationConfiguration( { @@ -149,15 +151,25 @@ class MainKtsConfigurator : RefineScriptCompilationConfigurationHandler { } private fun compiledScriptUniqueName(script: SourceCode, scriptCompilationConfiguration: ScriptCompilationConfiguration): String { - val digestWrapper = MessageDigest.getInstance("MD5") - digestWrapper.update(script.text.toByteArray()) + val digestWrapper = MessageDigest.getInstance("SHA-256") + + fun addToDigest(chunk: String) = with(digestWrapper) { + val chunkBytes = chunk.toByteArray() + update(chunkBytes.size.toByteArray()) + update(chunkBytes) + } + + digestWrapper.update(COMPILED_SCRIPTS_CACHE_VERSION.toByteArray()) + addToDigest(script.text) scriptCompilationConfiguration.notTransientData.entries .sortedBy { it.key.name } .forEach { - digestWrapper.update(it.key.name.toByteArray()) - digestWrapper.update(it.value.toString().toByteArray()) + addToDigest(it.key.name) + addToDigest(it.value.toString()) } return digestWrapper.digest().toHexString() } private fun ByteArray.toHexString(): String = joinToString("", transform = { "%02x".format(it) }) + +private fun Int.toByteArray() = ByteBuffer.allocate(Int.SIZE_BYTES).also { it.putInt(this) }.array()