加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 05:39:48 所属栏目:百科 来源:网络整理
导读:我在C#工作.我有一个无符号的32位整数i,它会逐渐递增以响应外部用户控制的事件.该数字以十六进制显示,作为用户能够输入和查看以后查找的唯一ID.我需要显示一个非常不同的8个字符串,如果它增加或两个整数在值上接近在一起(例如,距离256).例如,如果i = 5且j =
我在C#工作.我有一个无符号的32位整数i,它会逐渐递增以响应外部用户控制的事件.该数字以十六进制显示,作为用户能够输入和查看以后查找的唯一ID.我需要显示一个非常不同的8个字符串,如果它增加或两个整数在值上接近在一起(例如,距离<256).例如,如果i = 5且j = 6则:
string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"

对此的限制是:

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

然而:

>该算法不需要加密安全.混淆的目标是混淆.这个数字本身并不是秘密,它只是不需要显然是一个递增的数字.
>如果查看增量数字的大列表,人类可以辨别出字符串如何变化的模式,这是正常的.如果它们“接近”,我只是不希望它显而易见.

我认识到Minimal Perfect Hash Function满足了这些要求,但是我找不到能够做到我需要的东西,或者学会如何得到一个能够做到的东西.

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读