我在C#工作。我有一个无符号的32位整数i
,它会逐渐递增以响应外部用户控制的事件。该数字以十六进制显示,作为用户能够输入和查看以后查找的唯一ID。我需要i
来显示一个非常不同的8个字符串,如果它是递增的,或者两个整数在值上相反(例如,距离<256)。例如,如果i = 5
和j = 6
则:
string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"
对此的限制是:
然而:
我认识到Minimal Perfect Hash Function满足了这些要求,但我找不到能够做到我需要的东西,或者学会如何推导出那些要求。
我见过this question,虽然它是类似的,但我相信我的问题在其要求中更加具体和精确。给出这个问题的答案(截至本文撰写时)引用了3个可能的实现链接,但不熟悉Ruby我不知道如何获得“obfuscate_id”(第一个链接)的代码,Skipjack感觉像是矫枉过正我需要的东西(第二个链接),Base64不使用我感兴趣的字符集(十六进制)。
答案 0 :(得分:3)
y = p * x mod q
是可逆的。特别地,mod 2 ^ 32是容易的,并且任何奇数是2 ^ 32的共素。现在17,34,51,...
有点太容易了,但2^31 < p < 2^32-2^30 (0x8000001-0xBFFFFFFF)
的模式不太明显。