我正在生成带有时间戳部分(48 位)和随机部分(80 位)的 ID,以便 ID 有序但不会冲突。将 ID 序列化为人类可读格式时,我希望 ID 随机出现。序列化需要是可逆的,因为我需要将 ID 反序列化回其有序的时间戳/随机形式。
我不需要序列化是安全的,如果它很容易被逆向工程也没关系,我只想要一个随机生成的 ID 的外观。
我要编码的一些十六进制 ID 示例:
16CF304F7B3D5CBED3977C90DD6F5
16CF30578DCBCF35A0585A4FF6DE0
16CF30599F53BB7E61791824D6345
由于 ID 格式,我需要一种适用于 128 位值的方法。
最佳答案
由于最低位是随机的,这里有一个非常快速的解决方案:
fn mix (x: u128) -> u128 {
(x << 64) ^ x
}
函数本身就是逆向的,所以mix (mix (x)) == x
。
关于random - 从时间戳生成确定性随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57760843/