gpt4 book ai didi

c# - 高效的位重映射算法

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:04 29 4
gpt4 key购买 nike

我有一个用例,我需要以这样的方式加扰输入:

  1. 每个特定的输入总是映射到一个特定的伪随机输出。
  2. 输出必须充分混洗输入,以便递增输入映射到伪随机输出。

例如,如果输入是 64 位,则必须恰好有 2^64 个唯一输出,并且这些输出必须尽可能打破递增输入(任意要求)。

我将使用 C# 编写此代码,但可以从 Java 或 C 转换,只要没有 SIMD 内在函数。我正在寻找的是一些已经存在的代码,而不是重新发明轮子。

我在 Google 上看过,但没有找到任何可以进行 1:1 映射的内容。

最佳答案

这似乎工作得很好:

const long multiplier = 6364136223846793005;
const long mulinv_multiplier = -4568919932995229531;
const long offset = 1442695040888963407;

static long Forward(long x)
{
return x * multiplier + offset;
}

static long Reverse(long x)
{
return (x - offset) * mulinv_multiplier;
}

只要 multiplier 是奇数且 mulinv_multiplier 是模乘逆元,您就可以将常量更改为任何值(参见 wiki:modular multiplicative inverse 或 Hackers Delight 10-15 Exact Division by Constants ) 的 multiplier(模 2^64,显然 - 这就是为什么 multiplier 必须是奇数,否则它没有逆)。

偏移量可以是任何值,但为了安全起见,将其与 2^64 相对质数化。

这些特定常数来自 Knuth 的线性同余生成器。

有一件小事:它将输入的 LSB 的补码放在结果的 LSB 中。如果这是一个问题,您可以将其旋转任何非零量。


对于 32 位,常量可以是 multiplier = 0x4c957f2doffset = 0xf767814fmulinv_multiplier = 0x329e28a5

对于 64 位,multiplier = 12790229573962758597mulinv_multiplier = 16500474117902441741 可能效果更好。


或者,您可以使用 CRC,对于 CRC64,它是 reversible(即输入与 CRC 的大小相同),当然需要进行一些修改。

关于c# - 高效的位重映射算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12370415/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com