Расшифровка хэш-кода - PullRequest
       1

Расшифровка хэш-кода

0 голосов
/ 01 октября 2018

где я допустил ошибку?

Необязательное. Исключение исключения в потоке "main" 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 голосов
/ 01 октября 2018

Этот бит:

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

является подозрительным.Строки являются типами значений типа сортировки в Java, поэтому, если у вас есть две строки, которые оба «мяу», велика вероятность, что они занимают одно и то же пространство памяти и, следовательно, имеют одинаковое значение hashcode().Однако, если вы возьмете toLowerCase() этой строки, вы получите новую, другую строку и очень высокую вероятность другого хеш-кода.

Итак, вопрос в том, чего именно вы пытаетесь достичьс этой линией?

0 голосов
/ 01 октября 2018

Вы вызываете этот конвейер обработки в пустом потоке aStream, что приводит к пустому Необязательному.

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

Поскольку значение внутри Optional пусто, вы выбрасываете это исключение.

stringStream.orElseThrow(() -> new IllegalStateException("NULL"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...