我在 C# 中工作。我有一个无符号的 32 位整数i
,它会随着外部用户控制的事件而逐渐递增。该数字以十六进制显示为唯一的 ID,供用户稍后输入和查找。我需要i
显示一个非常不同的 8 个字符串,如果它增加或两个整数在值上接近(例如,距离 < 256)。例如,如果i = 5
然后j = 6
:
string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"
对此的限制是:
- 我不希望字符串在每个增量中如何变化的明显模式。
- 这个过程需要是可逆的,所以如果给定字符串,我可以生成原始数字。
- 每个生成的字符串对于 32 位无符号整数的整个范围都必须是唯一的,这样两个数字就不会产生相同的字符串。
- 生成字符串的算法应该很容易实现和维护,用于编码和解码(可能每行 30 行或更少)。
然而:
- 该算法不需要是密码安全的。目标是混淆而不是加密。数字本身并不是秘密,它只是不需要明显是一个递增的数字。
- 如果查看大量递增的数字,人类可以辨别字符串如何变化的模式,那就没问题了。如果它们“接近”,我只是不希望它很明显。
我认识到最小完美散列函数满足这些要求,但我一直无法找到一个能够满足我需要的功能,或者无法学习如何推导出一个能够满足这些要求的功能。
我见过这个问题,虽然它是类似的,但我相信我的问题在要求上更加具体和精确。该问题的答案(在撰写本文时)引用了 3 个可能实现的链接,但不熟悉 Ruby 我不确定如何获取“obfuscate_id”(第一个链接)的代码,Skipjack 感觉有点矫枉过正对于我需要的东西(第二个链接),并且 Base64 不使用我感兴趣的字符集(十六进制)。