5

我在 C# 中工作。我有一个无符号的 32 位整数i,它会随着外部用户控制的事件而逐渐递增。该数字以十六进制显示为唯一的 ID,供用户稍后输入和查找。我需要i显示一个非常不同的 8 个字符串,如果它增加或两个整数在值上接近(例如,距离 < 256)。例如,如果i = 5然后j = 6

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

对此的限制是:

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

然而:

  1. 该算法不需要是密码安全的。目标是混淆而不是加密。数字本身并不是秘密,它只是不需要明显是一个递增的数字。
  2. 如果查看大量递增的数字,人类可以辨别字符串如何变化的模式,那就没问题了。如果它们“接近”,我只是不希望它很明显。

我认识到最小完美散列函数满足这些要求,但我一直无法找到一个能够满足我需要的功能,或者无法学习如何推导出一个能够满足这些要求的功能。

我见过这个问题,虽然它是类似的,但我相信我的问题在要求上更加具体和精确。该问题的答案(在撰写本文时)引用了 3 个可能实现的链接,但不熟悉 Ruby 我不确定如何获取“obfuscate_id”(第一个链接)的代码,Skipjack 感觉有点矫枉过正对于我需要的东西(第二个链接),并且 Base64 不使用我感兴趣的字符集(十六进制)。

4

1 回答 1

3

y = p * x mod q如果 p 和 q 是互质数,则可逆。特别是,mod 2^32 很容易,任何奇数都是 2^32 的互质数。现在17,34,51,...有点太容易了,但是对于2^31 < p < 2^32-2^30 (0x8000001-0xBFFFFFFF).

于 2013-09-09T15:47:30.873 回答