模糊5位数字

时间:2013-01-30 00:09:26

标签: c# algorithm hash

我想混淆一个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;

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

2 个答案:

答案 0 :(得分:2)

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

12345 ^ 65535 = 53190
53190 ^ 65535 = 12345

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

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

答案 1 :(得分:0)

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

  1. 为您的号码添加5位数的种子值,如果它溢出为6位数,则丢弃第6位。

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

  3. E.g。

    丢弃溢出后

    12345 + 97531 = 109876或09876 重新订购68097