java - HashMap: containsKey() 不应该是真的?

标签 java encryption jvm hashmap obfuscation

我目前正在一起为学校作业编写混淆程序。我试图让程序读取一个文件,然后创建一个新文件,用我从 HashMap 中提取的相应值替换文件中的每个字母。 .我设置了一大堆键和值,但稍后在编写新文件的过程中,我尝试在附加到新的 String 之前检查映射是否包含键。 .检查的字符实际上在我正在读取以测试的文件中,并且文件被正确读取。然而它失败了 encryptionDict.containsKey() (我的 HashMap )方法。

我希望有 Java 专家能帮我解决这个问题!我很无能,我更像是一个C和D的人。唯一让我印象深刻的想法是它会像 Strings where "foo" != "foo" 一样。 .但字符不是对象。

代码在下面的 pastebin 中,要查看的关键部分是类构造函数、方法 encrypt 和方法 initDictionary , 也有人可以告诉我为什么 HashMap<char, String>无效,是因为我必须使用对象吗?

代码:http://pastebin.com/NcHTHPfw

最佳答案

 private HashMap<char [], String> initDictionary() {
                HashMap<char [], String> d = new HashMap<char [], String>();

                d.put("a".toCharArray(), "!\"#¤");
                d.put("b".toCharArray(), "¤#\"!");
                d.put("c".toCharArray(), "\"#¤%");
                d.put("d".toCharArray(), "%¤#\"");
                d.put("e".toCharArray(), "#¤%&");
                d.put("f".toCharArray(), "&%¤#");
                d.put("g".toCharArray(), "¤%&/");
                d.put("h".toCharArray(), "/&%¤");
                d.put("i".toCharArray(), "%&/(");
                d.put("j".toCharArray(), "(/&%");
                d.put("k".toCharArray(), "&/()");
                d.put("l".toCharArray(), ")(/&");
                d.put("m".toCharArray(), "/()=");
                d.put("n".toCharArray(), "=)(/");
                d.put("o".toCharArray(), "()=?");
                d.put("p".toCharArray(), "?=)(");
                d.put("q".toCharArray(), ")=?!");
                d.put("r".toCharArray(), "!?=)");
                d.put("s".toCharArray(), "=?!\"");
                d.put("t".toCharArray(), "\"!?=");
                d.put("u".toCharArray(), "?!\"#");
                d.put("v".toCharArray(), "#\"!?");
                d.put("w".toCharArray(), ";:*^");
                d.put("x".toCharArray(), "^*:;");
                d.put("y".toCharArray(), ":*^>");
                d.put("z".toCharArray(), ">^*:");
// etc.

这是有问题的一点。您不能在 Java 中使用数组作为哈希键,因为 Array 不会覆盖 equals() 和 hashCode() 方法。

hashCode 用于找到包含您要查找的对象的正确桶,equals() 方法比较实际的对象。要使用 HashMap,您需要以合理的方式覆盖这两个方法,但您不能这样做,因为数组类是最终的。因此,如果您绝对坚持使用 char 数组,您唯一可以做的就是使用包装类作为具有 char 数组的键。

像这样:

public class Key {
    private final char[] array;

    public Key(final String string) {
        this(string.toCharArray());
    }
    public Key(final char[] array) {
        this.array = array;
    }

    public char[] getArray() {
        return array;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Key key = (Key) o;

        if (!Arrays.equals(array, key.array)) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return array != null ? Arrays.hashCode(array) : 0;
    }
}

现在你可以拥有一个Map<Key, String>和一个 Key来自 String 的对象或 char[]

关于java - HashMap: containsKey() 不应该是真的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371454/

相关文章:

单线程的 Java 线程池未按预期运行

java - JComboBox:选择后出现错误的形式

java - 使用多线程程序并行编译项目比使用单线程程序有任何性能优势吗?

java - IBM JRE gencon 策略中的歧义和详细 :gc output

java - 如何使变量在Java中随处可用而无需参数

java - 从 Frege 调用 native Java 构造函数

Java 内存使用 - 原语

c++ - 使用带有安全字符串的openssl加密文件

java - 如何在Java中从字母表中的 "z"循环回 "a"?

.NET 的 SslStream 总是协商我拥有的最不安全的密码。我怎样才能改变这个?