Java vigenere 密码性能问题

Posted

技术标签:

【中文标题】Java vigenere 密码性能问题【英文标题】:Java vigenere cipher performance issues 【发布时间】:2013-10-26 12:41:30 【问题描述】:

我制作了一个 vigenere 加密/解密程序,它似乎可以按我的预期工作,但是在一个非常大的文本文件(大约 500,000 个字符)上运行我的加密/解密需要 2-4 分钟。我查看了我的代码,看不到哪些操作可能会减慢它的速度。任何人都知道如何加快速度?

代码:

public static String encrypt(String text, String key)

    String cipherText = "";
    text = text.toLowerCase();
    for(int i = 0; i < text.length(); i++)
    
        System.out.println("Count: "+ i); //I just put this in to check the 
                                          //loop wasn't doing anything unexpected
        int keyIndex = key.charAt(i%key.length()) - 'a';
        int textIndex = text.charAt(i) - 'a';
        if(text.charAt(i) >= 'a' && text.charAt(i) <= 'z')  //check letter is in alphabet
            int vigenere = ((textIndex + keyIndex) % 26) + 'a';
            cipherText = cipherText + (char)vigenere;
         else 
            cipherText = cipherText + text.charAt(i);
        

    
    return cipherText;

在运行加密之前,我有一个使用扫描仪将文本文件读取到字符串的方法。这个字符串加上一个预定义的密钥用于创建加密文本。

谢谢。

回答

感谢 RC - 这是我的字符串连接花时间。如果其他人有兴趣,这是我更新的代码,现在可以快速运行:

public static String encrypt(String text, String key)

    StringBuilder cipher = new StringBuilder();
    for(int i = 0; i < text.length(); i++)
    
        int keyIndex = key.charAt(i%key.length()) - 'a';
        int textIndex = text.charAt(i) - 'a';
        if(text.charAt(i) >= 'a' && text.charAt(i) <= 'z') 
            int vigenere = ((textIndex + keyIndex) % 26) + 'a';
            cipher.append((char)vigenere);
         else 
            cipher.append(text.charAt(i));
        

    
    return cipher.toString();

【问题讨论】:

使用 StringBuilder 进行字符串连接 非常感谢!所以我假设不使用它只是为添加的每个字符重建一个新字符串,因此随着字符串变长,每次迭代花费的时间越来越长。再次感谢 【参考方案1】:

追加到 StringBuilder 而不是创建新的 String 实例。 你想做一个

buffer.append((char)vigenere);

而不是cipherText = cipherText + (char)vigenere;

【讨论】:

【参考方案2】:

目前你正在做

for(int i = 0; i < text.length(); i++)
    ...
    int keyIndex = key.charAt(i%key.length()) - 'a';
    ...

您可以尝试从for-loop 中删除 keyIndex 的计算,并在预处理步骤中实现它。例如,您可以将 keyIndex 值/字符存储在单独的数组中,并在原始循环中访问数组内容。这应该会为您节省一些计算步骤。

【讨论】:

以上是关于Java vigenere 密码性能问题的主要内容,如果未能解决你的问题,请参考以下文章

Java Vigenere 密码

使用从文件中读取明文的 Vigenere 密码进行加密 (JAVA)

Java 中的 Vigenere 密码算法 - 将消息解密为明文

Vigenere Cipher(Java)[重复]

vigenere 密码的问题

我的 CS50 Vigenere 密码程序有啥问题?