如何将 Kotlin 中的 shorten/hash UUID 设置为最大 20 长度的字符串?

How to shorten/hash UUID in Kotlin to maximum 20 lenght String?

我有一个数据库和一个 Kotlin 程序,它们具有 entities/objects 的唯一 UUID(例如“79c89a6e-543f-414a-bd81-f0ee55847390”),我正在尝试 hash/shorten 它们作为通过 API 发送的字符串,最大长度为 20 个字符(不幸的是,这是我无法更改的要求)。

我对 Kotlin 还很陌生,我正在努力理解哈希概念,我阅读了很多关于 base64 和其他概念的文章,但我无法得到结果。有没有捷径呢?是否有可能取回 UUID?非常感谢

一般来说,哈希函数是不可逆的。所以如果你想保留原来的uuid,你必须压缩它(一个散列函数可以将多个值映射到同一个散列)。 uuid 是一个 128 位数字,显示为 32 个字符长的十六进制字符串(不包括连字符,每个字符代表 4 位)。您可以用 1 个 ascii 字符显示 2 个十六进制字符。请注意,结果可能包含特殊字符(例如换行符),这可能会导致 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("")
}