package com.xuqm.sdk.log object Fingerprint { fun compute(type: String, message: String, stack: String): String { val top3 = stack.lines().filter { it.trim().startsWith("at ") }.take(3).joinToString("|") val normalized = message.replace(Regex("\\b\\d{4,}\\b"), "N") return sha256("$type:$normalized:$top3") } private fun sha256(s: String): String = java.security.MessageDigest.getInstance("SHA-256") .digest(s.toByteArray()) .joinToString("") { "%02x".format(it) } }