【发布时间】:2016-08-29 22:04:14
【问题描述】:
背景
我有一个我编写的简单媒体客户端/服务器,我想生成一个不明显的时间值,我将每个命令从客户端发送到服务器。时间戳将包含相当多的数据(纳秒分辨率,即使它不是真正准确,由于现代操作系统中定时器采样的限制)等。
我想要做的(在 Linux 上,在 C 中)是生成一个一对一的 n 位值序列(假设数据现在存储在 128 位整数数组元素中)没有重叠/冲突的值。然后,我将一个伪随机 128 位值/数字作为“盐”,将其应用于时间戳,然后开始向服务器发送命令,增加预加盐/预散列值。
时间戳大小如此之大的原因是时间戳可能必须适应非常长的持续时间。
问题
如何使用初始盐值完成这样的序列(非冲突)? The best approach that sounds along the lines of my goal is from this post, which notes:
如果选项 1 对您来说不够“随机”,请使用上述的 CRC-32 哈希 全局(32 位)计数器。之间存在一对一的映射(双射) N 位整数和它们的 CRC-N 因此仍然可以保证唯一性。
但是,我不知道:
- 如果可以(有效地)扩展到 128 位数据。
- 如果为序列提供初始种子的某种加法/乘法盐值会破坏它或引入冲突。
跟进
我意识到我可以使用来自 libssl 的 128 位随机哈希或类似的东西,但我希望远程服务器使用相同的盐值,能够将哈希时间戳转换回它们的真实值。
谢谢。
【问题讨论】:
-
关于序列:Xorshift128 是一个快速的 128 位伪随机数生成器,周期为 2¹²⁸-1。也就是说,给定任何非零的 128 位数,它会产生另一个非零的 128 位数;该序列遍历所有 128 位无符号整数,除了零。所有周期为 (2ⁿ)-1 的 n 位 PRNG 都具有这样的特征,而不仅仅是线性同余的。
-
未来证明你的程序,直到宇宙热死。我喜欢它..
-
是的,您可以将 CRC 扩展到 128 位,您可以在 Wikipedia 的 LFSR 页面上找到它的系数,但是对于它所实现的,还有更有效的操作。是的,您可以将盐添加或乘以(如果奇怪的话)到任何等效函数中,而不会引入冲突(mod 2**128)。只要两个函数是 1:1,链接它们的结果也必须是 1:1。我有这样的功能,但我必须将我的搜索工具扩展到 128 位才能找到合适的参数。
-
我不确定我是否明白这一点。当然,任何旧的 128 位 LFSR 都可以,但除了浪费处理器时间之外,我认为这样做没有任何意义。为什么不直接发送呢?如果您出于某种原因需要隐藏它,那么您将需要真正的加密; LFSR 根本没有给你任何安全性。
标签: c linux random hash uniqueidentifier