C# 如何对一个数字进行编码,使微小的变化产生完全不同的编码?
我在C#工作。我有一个无符号32位整数C# 如何对一个数字进行编码,使微小的变化产生完全不同的编码?,c#,algorithm,encoding,scramble,C#,Algorithm,Encoding,Scramble,我在C#工作。我有一个无符号32位整数I,它随着外部用户控制的事件而逐渐递增。该数字以十六进制显示为唯一ID,供用户稍后输入和查找。我需要I来显示一个非常不同的8个字符的字符串,如果它是递增的,或者两个整数的值非常接近(例如,距离
I
,它随着外部用户控制的事件而逐渐递增。该数字以十六进制显示为唯一ID,供用户稍后输入和查找。我需要I
来显示一个非常不同的8个字符的字符串,如果它是递增的,或者两个整数的值非常接近(例如,距离<256)。例如,如果i=5
和j=6
,则:
string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"
这方面的限制是:
我已经看到了,虽然这是沿着类似的路线,但我相信我的问题在要求上更加具体和准确。对于这个问题的答案(在本文撰写时)引用了3个链接作为可能的实现,但由于不熟悉Ruby,我不知道如何获得“模糊_id”(第一个链接)的代码,Skipjack觉得我需要的东西太多了(第二个链接),Base64没有使用我感兴趣的字符集(十六进制)如果p和q是共素数,则y=p*x模q是可逆的。特别是,mod 2^32很简单,任何奇数都是2^32的共素数。现在,
17,34,51,
有点太简单了,但是模式对于2^31
“我不希望字符串在每个增量中如何变化有一个明显的模式。”-好吧,创建自己的模糊模式显然也不是一个好主意,除非您对其进行大量测试。您是否尝试过寻找任何可用的库/API?我见过的唯一库本质上是加密的,通常不能很好地处理小到32位整数的数字。一个32位的块密码可以工作,但对于我所需要的东西来说似乎有些过分,我宁愿自己实现它,因为安全性不是问题,我正在努力降低外部依赖性。FWIW,“obfuscate_id”使用的实际算法在这里:谢谢。如果其他答案对我不起作用,我会看看是否可以移植它。@hatch22如果你不想让ID安全(即很难反转编码),混淆ID有什么意义?我是说什么是“明显的模式”?在哪一点上它会变得“不明显”。对我来说,这些模棱两可的地方就是为什么不值得去做。如果您需要使解码变得困难,那么就让解码变得实际困难(即加密安全)。我可能只是对需求是什么太天真了。编辑啊如果你只是想阻止JimMischel的网页抓取示例,那么简单的模块化算术技巧MSalter是有意义的。这看起来很像RSA加密,检查一下纯Python实现。核心在rsa.prime
和rsa.core
中,您应该能够充分遵循它,将其转换为C-)模运算与普通运算非常接近。如何求解x
的y=p*x
?将两边乘以1/p
。在这种情况下,域不是实数,而是直到q-1
的整数。那么什么是1/p
?它是1/p=z
这样的z*p=1 mod q
,对于一些整数k
,它导致z*p-1=kq=>z*p-kq=1
。这个方程有一个整数解,因为p
和q
是共素数,并且因为贝佐特的身份:。简单的回答是。。。只需找到mod q
的逆z=1/p
。示例:q=5,p=2,1/p=3
。看起来我可能创建了一个副本,并且链接到那里的答案使用了32位的块密码,但是MSalters答案似乎对我有效,所以我将继续并接受它。