哈希码解密

时间:2018-10-01 07:10:53

标签: java lambda

我在这里犯错了吗?

  

Optional.empty线程“主”中的异常   java.lang.IllegalStateException:在处为NULL   flagctf.IsItTheFlag.lambda $ 2(IsItTheFlag.java:28)在   java.util.Optional.orElseThrow(Optional.java:290)在   flagctf.IsItTheFlag.main(IsItTheFlag.java:28)

    public class IsItTheFlag {

    private static boolean isFlag(String str) {
        return str.hashCode() == 1471587914 && str.toLowerCase().hashCode() == 1472541258;
    }

    public static void main(String[] args) {

        String TheFlag = "------";

        Stream<String> aStream = Stream.empty();
        for (int i = 0; i < TheFlag.length(); i++) {
            aStream = aStream.flatMap(IsItTheFlag::word);
        }
        Optional<String> stringStream = aStream
                .parallel()
                .filter(IsItTheFlag::isFlag)
                .findAny();

        System.out.println(stringStream);

        String flag = stringStream.orElseThrow(() -> new IllegalStateException("NULL"));


        if (isFlag(flag))
            System.out.println("You found it!");
        else
            System.out.println("Try again :(");
    }

    private static Stream<Character> letters() {
        Stream<Character> from_a_to_z = IntStream.range((int) 'a', 1 + (int) 'z').mapToObj(x -> (char) x);
        Stream<Character> from_A_to_Z = IntStream.range((int) 'A', 1 + (int) 'Z').mapToObj(x -> (char) x);
        Stream<Character> from_0_to_9 = IntStream.range((int) 'A', 1 + (int) 'Z').mapToObj(x -> (char) x);
        return Stream.concat(
                Stream.concat(from_a_to_z, from_A_to_Z),
                from_0_to_9);
    }

    private static Stream<String> word(String prefix) {
        return letters().map(x -> prefix + x);
    }

}

2 个答案:

答案 0 :(得分:1)

您在空流aStream上调用此处理管道,这会导致空的Optional。

aStream.parallel().filter(IsItTheFlag::isFlag).findAny();

由于Optional中的值为空,因此引发此异常。

stringStream.orElseThrow(() -> new IllegalStateException("NULL"))

答案 1 :(得分:0)

此位:

str.hashCode() == 1471587914 && str.toLowerCase().hashCode() == 1472541258;

可恶。字符串是Java中的排序值类型,因此,如果您有两个都是“喵”的字符串,则很有可能它们占据相同的内存空间,因此具有相同的hashcode()。但是,如果使用该字符串的toLowerCase(),则会得到一个新的不同的字符串,并且很有可能会使用不同的哈希码。

问题是,您到底想用那条线实现什么?