首页 > 解决方案 > 从时间戳生成确定性随机数

问题描述

我正在生成带有时间戳部分(48 位)和随机部分(80 位)的 ID,以便 ID 是有序的但不会发生冲突。将 ID 序列化为人类可读格式时,我希望 ID显示为随机的。序列化需要是可逆的,因为我需要将 ID 反序列化回其有序的时间戳/随机形式。

我不需要序列化是安全的,如果它很容易逆向工程就可以了,我只想要一个随机生成的ID的外观。

我要编码的一些十六进制 ID 的示例:

16CF304F7B3D5CBED3977C90DD6F5
16CF30578DCBCF35A0585A4FF6DE0
16CF30599F53BB7E61791824D6345

由于 ID 格式的原因,我需要一种适用于 128 位值的方法。

标签: randomrust

解决方案


由于最低位是随机的,因此这是一个非常快速的解决方案:

fn mix (x: u128) -> u128 {
    (x << 64) ^ x
}

操场

该函数是它自己的反向函数,所以mix (mix (x)) == x.


推荐阅读