У меня есть байтовый массив, который является хешем файла. Это сделано с messageDigest
, так что есть отступы. Затем я делаю короткое замыкание, которое представляет собой два первых байта хэша, например:
byte[] shorthash = new byte[2];
System.arraycopy(hash, 0, shortHash, 0, 2);
Чтобы сделать его читаемым для пользователя и сохранить его в БД, я конвертирую его в строку с Base64 Encoder
:
Base64.getUrlEncoder().encodeToString(hash); //Same for shorthash
Что я не понимаю, так это:
Почему строка, представляющая мои короткие четыре символа длиной? Я думал, что символ - это один или два байта, поэтому, поскольку я копирую только два байта, у меня не должно быть больше двух символов, верно?
Почему моя короткая строка не совпадает с началом строки хеша?
Например, у меня будет:
Hash: LE5D8vCsMp3Lcf-RBwBRbO1v4soGq7BBZ9kB_2SJnGY=
Shorthash: Rak=
Вы можете увидеть =
в конце каждого; это, конечно, исходит от заполнения MessageDigest
, так что это нормально для хэша, но почему для короткого кода? Это должны быть два ПЕРВЫХ байта, а =
в конце!
Более того: поскольку я хотел избавиться от этого отступа, я решил сделать это:
String finalHash = Base64.getUrlEncoder().withoutPadding().encodeToString(hash);
byte[] shorthash = new byte[2];
System.arraycopy(hash.getBytes(), 0, shortHash, 0, 2);
String finalShorthash = Base64.getUrlEncoder().encodeToString(shorthash);
Я не хотел копировать напрямую строку, поскольку я не совсем уверен, что будет двумя байтами в строке.
Затем =
ушел для моего хэша, но не для моего короткого замыкания. Я предполагаю, что мне нужно добавить опцию "WithoutPadding" в мой shorthash, но я не понимаю почему, так как это копия моего хэша, который больше не должен иметь padding. Кроме случаев, когда заполнение пропущено только в представлении String, а не в байте за ним?
Может кто-нибудь объяснить это поведение? Это происходит от преобразования между байтом [] и строкой?