C# 如何对一个数字进行编码,使微小的变化产生完全不同的编码?

C# 如何对一个数字进行编码,使微小的变化产生完全不同的编码?,c#,algorithm,encoding,scramble,C#,Algorithm,Encoding,Scramble,我在C#工作。我有一个无符号32位整数I,它随着外部用户控制的事件而逐渐递增。该数字以十六进制显示为唯一ID,供用户稍后输入和查找。我需要I来显示一个非常不同的8个字符的字符串,如果它是递增的,或者两个整数的值非常接近(例如,距离

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

string a = Encoded(i); // = "AF293E5B"
string b = Encoded(j); // = "CD2429A4"
这方面的限制是:


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

  • 该算法不需要加密安全。目标是模糊处理而不是加密。这个数字本身并不是秘密,它只是不需要明显地是一个递增的数字
  • 如果看一个大的递增数字列表,人类可以识别字符串如何变化的模式,这是正常的。我只是不想让他们“接近”就变得明显
  • 我承认a满足这些要求,但我还没有找到一个能满足我需要的,或者学习如何推导出一个能满足我需要的


    我已经看到了,虽然这是沿着类似的路线,但我相信我的问题在要求上更加具体和准确。对于这个问题的答案(在本文撰写时)引用了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答案似乎对我有效,所以我将继续并接受它。