random - 从时间戳生成确定性随机数

标签 random rust

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

我不需要序列化是安全的,如果它很容易被逆向工程也没关系,我只想要一个随机生成的 ID 的外观。

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

16CF304F7B3D5CBED3977C90DD6F5
16CF30578DCBCF35A0585A4FF6DE0
16CF30599F53BB7E61791824D6345

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

最佳答案

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

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

playground

函数本身就是逆向的,所以mix (mix (x)) == x

关于random - 从时间戳生成确定性随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57760843/

相关文章:

C:从一个完全不同的范围中创建随机数

rust - 是否可以使用Iterator::filter_map添加条件过滤?

rust - Cargo 将 git 需求放在哪里?

javascript - D3 条形图未填充。

macos - MacOS 上的 Java 7 SecureRandom 性能

rust - 如何在最新版本(3.3.2)中实现Actix-web中间件?

multithreading - 如何摆脱阻塞的 TcpListener::accept 调用?

rust - 在 for 循环中使用拥有的指针访问枚举的内容

sql - 随机选择数据库

c - 编程不同权重的随机分布