random - 从时间戳生成确定性随机数
问题描述
我正在生成带有时间戳部分(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
.
推荐阅读
- java - Java:在 Linux 上向 Windows 发送文本
- git - 如何在 Atom 的树视图中摆脱这种恼人的绿色?
- objective-c - 为什么在比较崩溃时对 NSUInteger 进行减法运算?
- r - 使用 R 将来自两个 data.frames 的数据相乘和平均成一列
- r - 在 EXPSS 摘要中保留标签
- javascript - pouchDB 是否可以一次同步一个文档?
- ios - 设备方向改变时重绘 CoreGraphics 绘图
- c# - 如何使用 C# 找出安装在 SQL Server 中的 SSIS?
- loops - 当语句为真时,如何在 Kotlin 的“for循环”中增加 val
- python - Django - 将当前“艺术家”对象的主键作为“所有曲目”结果列表中的过滤器