Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删掉一个5位数的数字_C#_Algorithm_Hash - Fatal编程技术网

C# 删掉一个5位数的数字

C# 删掉一个5位数的数字,c#,algorithm,hash,C#,Algorithm,Hash,我想混淆一个5位数的数字 我关心的模糊编号的属性: 它不可能(或者作为一种退步,极不可能)与其他模糊的数字发生冲突 它也是一个5位数字(请不要使用字母字符) 如果没有计算帮助,普通人很难确定它(例如,它不是像“乘2减5”这样显而易见的事情) 这是一种算法……而不是将所有可能的5位数字的查找表存储到相应的哈希或其他“暴力”技术 我不关心的模糊编号的属性: 无论是否可重复,即如果“12345”总是导致“73624”,我都可以 不管它是否加密安全 到目前为止,我还没有找到任何符合我要求的东西…

我想混淆一个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;
static List bitMapping=new List(){8,6,9,3,7,5;
私有静态整型模糊(整型编号)
{
var bits=newbool[bitMapping.Count];
foreach(位映射中的变量序号)
{
变量掩码=(int)Math.Pow(2,序数);
变量位=(掩码和数字)=掩码;
var mappedOrdinal=位映射[ordinal];
位[mappedOrdinal]=位;
}
var obfuscatedNumber=0;
for(变量序号=0;序号<位.长度;序号++)
{
if(位[序数])
{
模糊的数字+=(int)Math.Pow(2,序数);
}
}
返回模糊数字;

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

如果你不想要冲突,那么乘法/除法就不存在了。在这种情况下,我会这样做

  • 在数字中添加5位种子值,如果溢出为6位,则丢弃第六位

  • 以某种一致的方式重新排列数字

  • 例如

    丢弃溢流后12345+97531=109876或09876
    重新排序到68097,这对于您的需要来说可能太简单了,但XOR操作可能会起作用,并且可能不像添加操作那样明显:

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


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

    根据定义,哈希是可重复的。如果您不关心该属性,为什么不用伪随机生成的数字替换该数字?如果您不关心一致性,“我不关心:它是否可重复”然后返回随机值它将被存储在哪里?我问,因为用户仅仅看数值就不容易解密乘2减5。它本来可以是任何东西。你想确保两个5位随机数不一样吗?你不能,但不太可能。我想是时候解释一下这是为了以及您打算如何使用它。一种方法:为每个数字添加一个偏移量,并环绕以使它们保持数字-每个位置一个固定偏移量,例如,3、5、7、4和8。有点像保险柜的组合锁。要解密,请减去值。“如果您不想发生冲突”如何与“以某种方式重新排列数字”相关没有。冲突是任何乘法或除法中固有的,你忽略了溢出或下溢。例如,00000*5=0,2000*5=100000,循环到00000,00020/5=0000400021/5=00004.2,循环到00004。比我聪明的人可能会说为什么,但我怀疑这会与贝卡发生冲突使用异或是可交换的。也许如果你保持键的常数,那么它就不会成为问题了?这只是猜测,因为我还没有对它进行足够的研究来反驳你的答案。如果你选择第二个常数,使它是2减1的幂(即,所有的1都是二进制的),那么就不会有碰撞了。啊,谢谢你的解释。这是有意义的。如果你做一系列的异或和加法呢?这会成为一个合法的1:1替换吗?会的,因为2的组合是一个双射。我觉得这会导致一个很难消除混淆的数字。不是说这是不可能的我想破解,但我肯定要花些时间才能弄明白,哈!