首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java vigenere密码性能问题

Java vigenere密码性能问题
EN

Stack Overflow用户
提问于 2013-10-26 12:41:30
回答 2查看 1.1K关注 0票数 0

我制作了一个vigenere加密/解密程序,它看起来像我想的那样工作,但是在一个非常大的文本文件(500万个字符aprox)上运行我的加密/解密需要2-4分钟。我已经查看了我的代码,无法看出哪些操作可能会减慢它的速度。有人知道我怎么能加快速度吗?

代码:

代码语言:javascript
复制
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;
}

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

谢谢。

答案

多亏了RC --这是我花时间串起来的。如果其他人对此感兴趣,这是我更新的代码,它现在运行得很快:

代码语言:javascript
复制
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();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-26 13:21:05

追加到StringBuilder,而不是创建新的字符串实例。你想做一个

代码语言:javascript
复制
buffer.append((char)vigenere);

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

票数 0
EN

Stack Overflow用户

发布于 2013-10-26 13:24:24

目前你正在做

代码语言:javascript
复制
for(int i = 0; i < text.length(); i++){
    ...
    int keyIndex = key.charAt(i%key.length()) - 'a';
    ...
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19606829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档