我有一个数据库和一个Kotlin程序,具有用于实体/对象的唯一UUID(例如'79c89a6e-543f-414a-bd81-f0ee55847390'),我试图将它们哈希/缩短为字符串,以便通过API使用最多20个字符的长度(很遗憾,这是我不能更改的要求)。
我对Kotlin还是很陌生,我一直在努力理解哈希概念,我读了很多有关base64和其他概念的文章,但我无法获得结果。有没有捷径可做?是否可以取回UUID?非常感谢
通常,哈希函数不可逆。因此,如果要保留原始的uuid,则必须对其进行压缩(哈希函数可以将多个值映射到同一哈希)。 uuid是显示为32个字符的十六进制字符串(不包括连字符,每个字符代表4位),是一个128位数字。您可以显示2个十六进制字符和1个ascii字符。请注意,结果中可能包含特殊字符(例如换行符),这可能会导致api出现问题。
fun main() {
val x0 = "79c89a6e-543f-414a-bd81-f0ee55847390"
val x1 = encode(x0)
println(x1) // yÈnT?AJ½ðîUs
println(x1.length) // 16
val x2 = decode(x1)
println(x0 == x2) // true
}
fun encode(uuid: String): String {
return uuid
// Remove hyphens
.replace("-", "")
// Iterate over 2 character blocks
.chunked(2)
// Parse hex number and convert it to a ascii character
.map { it.toInt(16).toChar() }
// Join character list to string
.joinToString("")
}
fun decode(str: String): String {
val charList = str
// Convert ascii character to hex string with leading 0
.map { it.toInt().toString(16).padStart(2, '0') }
.toMutableList()
// Readd hyphens
for (i in (10 downTo 4).step(2)) {
charList.add(i, "-")
}
// Join character list to string
return charList.joinToString("")
}