C# 删掉一个5位数的数字
我想混淆一个5位数的数字 我关心的模糊编号的属性:C# 删掉一个5位数的数字,c#,algorithm,hash,C#,Algorithm,Hash,我想混淆一个5位数的数字 我关心的模糊编号的属性: 它不可能(或者作为一种退步,极不可能)与其他模糊的数字发生冲突 它也是一个5位数字(请不要使用字母字符) 如果没有计算帮助,普通人很难确定它(例如,它不是像“乘2减5”这样显而易见的事情) 这是一种算法……而不是将所有可能的5位数字的查找表存储到相应的哈希或其他“暴力”技术 我不关心的模糊编号的属性: 无论是否可重复,即如果“12345”总是导致“73624”,我都可以 不管它是否加密安全 到目前为止,我还没有找到任何符合我要求的东西…
- 它不可能(或者作为一种退步,极不可能)与其他模糊的数字发生冲突
- 它也是一个5位数字(请不要使用字母字符)
- 如果没有计算帮助,普通人很难确定它(例如,它不是像“乘2减5”这样显而易见的事情)
- 这是一种算法……而不是将所有可能的5位数字的查找表存储到相应的哈希或其他“暴力”技术
- 无论是否可重复,即如果“12345”总是导致“73624”,我都可以
- 不管它是否加密安全
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,序数);
}
}
返回模糊数字;
到目前为止,它似乎满足了我的大部分要求。如果你不想要冲突,那么乘法/除法就不存在了。在这种情况下,我会这样做
重新排序到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的组合是一个双射。我觉得这会导致一个很难消除混淆的数字。不是说这是不可能的我想破解,但我肯定要花些时间才能弄明白,哈!