如何将 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("")
}
我有一个数据库和一个 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("")
}