模糊处理 5 位数字

本文关键字:数字 处理 模糊 | 更新日期: 2023-09-27 17:56:30

我想混淆一个 5 位数字

我关心的混淆数字的属性:

    不可能
  • (或作为后备,极不可能)与其他混淆的数字发生冲突
  • 它也是一个 5 位数字(请不要使用字母字符)
  • 如果没有计算帮助,普通人不容易确定它(例如,它不是像"乘以 2 并减去 5"这样明显的东西)
  • 这是一种算法...而不是将所有可能的 5 位数字的查找表存储到其相应的哈希值或其他一些"蛮力"技术中

我不关心的混淆数字的属性:

  • 无论它是否可重复,即如果"12345"总是导致"73624",我没关系
  • 它是否加密安全
到目前为止,我

还没有找到任何符合我要求的东西......但我希望这是由于记忆力差,教育不完整或生活方式选择可疑,而不是没有"好"的解决方案。

一个可以轻松转换为 C# 的示例将是一个奖励。

更新:

我正在研究使用目前进行简单位映射的想法。

   static List<int> bitMapping = new List<int>() { 8, 6, 9, 3, 7, 5, ... etc... };
    private static int Obfuscate(int number)
    {
        var bits = new bool[bitMapping.Count];
        foreach (var ordinal in bitMapping)
        {
            var mask = (int)Math.Pow(2, ordinal);
            var bit = (mask & number) == mask;
            var mappedOrdinal = bitMapping[ordinal];
            bits[mappedOrdinal] = bit;
        }
        var obfuscatedNumber = 0;
        for (var ordinal = 0; ordinal < bits.Length; ordinal++)
        {
            if (bits[ordinal])
            {
                obfuscatedNumber += (int)Math.Pow(2, ordinal);
            }
        }
        return obfuscatedNumber;

到目前为止,它似乎满足了我的大部分要求。

模糊处理 5 位数字

对于您的需求来说,这可能太简单了,但是有效并且可能不像添加那样明显的东西是XOR操作:

12345 ^ 65535 = 53190
53190 ^ 65535 = 12345

如注释中所述,重要的是第二个操作数的形式是 (2n - 1),以避免冲突(以便原始数字中的每个位都反转)。它还需要足够长,使其位数大于或等于第一个操作数。

您可能还必须用 0 向左填充以使结果成为 5 位数字。

如果你不想要碰撞,那么乘法/除法就出来了。在这种情况下,我会

  1. 在您的号码中添加一个 5 位种子值,如果它溢出到六位数字,则丢弃第六位。

  2. 以某种一致的方式对数字重新排序。

例如

丢弃溢出后的 12345 + 97531 = 109876或 09876重新订购至 68097