用于密码字母表的自定义数组shuffle中的重复项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于密码字母表的自定义数组shuffle中的重复项相关的知识,希望对你有一定的参考价值。

我有一个生成随机密码字母表的分配,然后加密和解密用户输入的消息。加密和输入正在工作时,解密正在返回错误的消息。经过进一步调查,我发现这是因为我的混乱密码字母表有重复。我尝试通过提供“swapped = true”方法来修复重复错误,以便不替换已经洗牌过的字母。然而,这只是增加了漏洞,因此我删除了它。下面是我返回重复项的方法的代码。

 public static char[] cipherAlphabet(char[] alpha)
{
   Random rand = new Random();
   char[] newAlpha = new char[26];
   char current;
   int index;
   for (int i = 0; i < alpha.length; i +=1)
   {

       index = rand.nextInt(alpha.length);
       newAlpha[i] = alpha[index];
       newAlpha[index] = alpha[i];
   }


   return newAlpha;
}

当我输入消息时

sample message 

这将返回加密

Encrypted Message:  WUFKRJ FJWWUMJ

和解码的消息

 samcle message

我不确定为什么这是一个字母,但我的字母表肯定有问题,因为它看起来像这样。

Regular Alphabet: abcdefghijklmnopqrstuvwxyz
Cipher Alphabet: ulktjvmihqyrfxnkjlwdzwvzkx
                 TWO Ws and Js     ^  ^

任何有关去哪里或代码的想法的帮助将不胜感激。

编辑:对于人们建议Collections.shuffle(),我需要使用随机进行此分配。

答案

我建议这样解决方案:

static Random rand = new Random();

public static char[] cipherAlphabet(char[] alpha) {

    // copy of alpha
    char[] copy = Arrays.copyOf(alpha, alpha.length);

    // linear time O(n)
    for (int i = 0; i < alpha.length; i += 1) {
        // random index
        int j = rand.nextInt(alpha.length);

        // swap
        char temp = copy[j];
        copy[j] = copy[i];
        copy[i] = temp;

    }

    return copy;
}

这个算法只需n步,其中n是字母表的长度。

在每次迭代中,您生成随机的新索引(j),然后交换第i和第j个元素。

无论您执行多少交换,字母表都没有重复。

另一答案

您错误地实现了交换逻辑。这个:

index = rand.nextInt(alpha.length);
newAlpha[i] = alpha[index];
newAlpha[index] = alpha[i];

使ith和indexth值等于indexth元素。要交换它们,您必须引入临时变量,如下所示:

index = rand.nextInt(alpha.length);
int tmp = newAlpha[i];
newAlpha[i] = alpha[index];
newAlpha[index] = tmp;

以上是关于用于密码字母表的自定义数组shuffle中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

用于获取表的所有条目并且仅包含基于特定列的许多重复项中的第一个的自定义查询

过滤数组列表或列表中的自定义对象[重复]

使用键更新数组中的自定义对象[重复]

如何将流的结果收集到Java 8中的自定义对象数组中[重复]

用于检查数组中的重复项的通用 Typescript 函数

用于密码验证的正则表达式 [重复]