如何编码一个数字,以便小的更改导致编码非常不同?

时间:2013-09-09 15:40:25

标签: c# algorithm encoding scramble

我在C#工作。我有一个无符号的32位整数i,它会逐渐递增以响应外部用户控制的事件。该数字以十六进制显示,作为用户能够输入和查看以后查找的唯一ID。我需要i来显示一个非常不同的8个字符串,如果它是递增的,或者两个整数在值上相反(例如,距离<256)。例如,如果i = 5j = 6则:

string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"

对此的限制是:

  1. 我不希望字符串在每个增量中的变化方式有明显的模式。
  2. 该过程需要是可逆的,因此如果给出字符串,我可以生成原始数字。
  3. 每个生成的字符串对于32位无符号整数的整个范围都必须是唯一的,这样两个数字就不会产生相同的字符串。
  4. 生成字符串的算法应该很容易实现和维护,无论是编码还是解码(每个或多或少30行)。
  5. 然而:

    1. 该算法不需要加密安全。混淆的目标是混淆。这个数字本身并不是秘密,它显然不需要增加数字。
    2. 如果查看增量数字的大列表,人类可以辨别出字符串如何变化的模式,这是正常的。如果它们“接近”,我只是不希望它显而易见。
    3. 我认识到Minimal Perfect Hash Function满足了这些要求,但我找不到能够做到我需要的东西,或者学会如何推导出那些要求。

      我见过this question,虽然它是类似的,但我相信我的问题在其要求中更加具体和精确。给出这个问题的答案(截至本文撰写时)引用了3个可能的实现链接,但不熟悉Ruby我不知道如何获得“obfuscate_id”(第一个链接)的代码,Skipjack感觉像是矫枉过正我需要的东西(第二个链接),Base64不使用我感兴趣的字符集(十六进制)。

1 个答案:

答案 0 :(得分:3)

如果p和q是共素数,则

y = p * x mod q是可逆的。特别地,mod 2 ^ 32是容易的,并且任何奇数是2 ^ 32的共素。现在17,34,51,...有点太容易了,但2^31 < p < 2^32-2^30 (0x8000001-0xBFFFFFFF)的模式不太明显。