【问题标题】:Generate code from id using a 1-1 function使用 1-1 函数从 id 生成代码
【发布时间】:2012-07-18 04:16:24
【问题描述】:

有没有好的可逆 1-1 函数可以将一个整数映射到另一个整数? 例如,给定范围 0-5,我想找到一个映射:

0->3
1->2
2->4
3->5
4->1
5->0

此外,映射应该看起来是随机的。

【问题讨论】:

    标签: algorithm function mapping


    【解决方案1】:

    您可以按升序填充数组并打乱它。这通常会表现得相当好,如果不是最有效的记忆。

    您还可以依赖封闭的离散变换,例如乘法。如果你有 2 个数字,P 和 K,那么(我认为)只要 P 和 K 互质,P^n mod K 将产生长度为 (K - 1) 的非重复伪随机序列,范围从 1 到K. 离散数学的这种特殊表现是密码学的前提之一。从序列倒退到指数称为离散对数问题,这也是传统 RSA 安全的原因。

    您要求使用可逆算法。如果您跟踪指数,您可以毫不费力地从 P^n mod K 转到 P^(n-1) mod K。您可以采取一些捷径从幂倒退到指数,这在密码学中不起作用,因为算法的某些参数被故意丢弃以使其更难。

    也就是说,如果您在解决离散日志问题时碰巧破坏了 RSA,请务必告诉我。

    【讨论】:

    • 如果K 是素数,则只能通过P^n 获得长度为K - 1 的序列。一般来说,限制是φ(K),当且仅当P 是一个原始根模K(其中有φ(K-1))。
    • 这个建议背后的数学相当神秘,我不会假装完全理解所有这些。
    • thanx,今晚让我试试这个模组 :)
    【解决方案2】:

    置换多项式怎么样?请参阅本文的第 3 部分:http://webstaff.itn.liu.se/~stegu/jgt2012/article.pdf 它用于那里的噪音,但看起来完全符合您的要求。

    建议构造(Ax^2 + Bx) mod M形式的函数。这些函数中只有一小部分是可逆的/产生排列,但如果它存在的话,应该不难找到实际的逆。

    【讨论】:

      【解决方案3】:

      Non-repetitive random seek in a range Algorithm 中讨论了与此类似的内容。我很感兴趣,在http://www.mcdowella.demon.co.uk/PermutationFromHash.html

      上发表了一些想法

      【讨论】:

        【解决方案4】:

        您可以使用分组密码生成这样的排列,而不必将整个事物保存在内存中(就像您要对列表进行洗牌一样)。我前段时间写了一篇关于它的博文,你可以找到here

        【讨论】:

          猜你喜欢
          • 2020-07-17
          • 2018-06-22
          • 2012-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多