Кодировать / декодировать строку в BigInteger в Java - PullRequest
0 голосов
/ 02 апреля 2019

Я работаю над реализацией, в которой я должен преобразовать длинный хеш String в BigInteger и обратно (функция должна быть обратимой), но я не понимаю, как заставить его работать в Java сэти классы.

Моей первой идеей было сделать что-то следующим образом:

given s:String
for every character in the input string:
    convert char to decimal ASCII representation (i.e. 'a' -> '97')
    append result to s
build a BigDecimal with the resulting s

, но проблема в том (как прокомментировали многие пользователи) длины преобразования, потому что символы ASCII идут отОт 0 до 255. Его можно изменить с 'a' -> '97' на 'a' -> '097', но опять-таки есть проблема с декодированием, убирающим нули заголовков для каждого символа (кстати, алгоритм менее эффективен)

Итак, в заключениепредложенный здесь алгоритм - не лучшая идея, поэтому я открыт для некоторых других решений.Также, если в String и / или BigInteger есть какая-либо библиотека или встроенный метод, это тоже полезно.Подпись

public class EncodeUtil {
    public BigInteger encode(String s) {...}
    public String decode(BigInteger bi) {...}
}

, и условие состоит в том, что decode(encode("som3_We1rd/5+ring")) выводит "som3_We1rd/5+ring"

Я думаю, стоит сказать, что полученные строки для декодирования являются хешами, такими как lQ5jkXWRkrbPlPlsRDUPcY6bwOD8Sm/tvJAVhYlLS3WwE5rGXv/rFRzyhn4XpUovwkLj2C3zS1JPTQ1FLPtxNXc2QLxfRcH1ZRi0RKJu1lK8TUCb6wm3cDw3VRXd21WRsnYKg6q9ytR+iFQykz6MWVs5UGM5NPsCw5KUBq/g3Bg=

Любая идея / предложение приветствуется.Заранее спасибо за ваше время.

1 Ответ

1 голос
/ 02 апреля 2019

Это примерно соответствует тому, что вы хотите - но то, что вы спросили, в частности, не будет работать, когда число цифр в "десятичном представлении ASCII" является переменным. Кроме того, вам нужна не хеш-функция :

public class Driver {
    public static void main(String[] args) {
        String s = "Reversible Hash a String to BigInteger in Java";

        System.out.println(HashUtil.notReallyHash(s));
        System.out.println(HashUtil.notReallyUnhash(HashUtil.notReallyHash(s)));
    }
}

class HashUtil {
    private static final byte SENTINEL = (byte) 1;

    public static BigInteger notReallyHash(String s) {
        CharBuffer charBuf = CharBuffer.wrap(s.toCharArray());
        ByteBuffer byteBuf = ByteBuffer.allocate(charBuf.length() * Character.BYTES + 1);

        byteBuf.put(SENTINEL); // need this in case first byte is 0 - biginteger will drop it
        byteBuf.asCharBuffer()
               .append(charBuf);

        return new BigInteger(1, byteBuf.array());
    }

    public static String notReallyUnhash(BigInteger bi) {
        ByteBuffer byteBuf = ByteBuffer.wrap(bi.toByteArray());

        byteBuf.get(); // SENTINEL

        CharBuffer charBuf = byteBuf.asCharBuffer();

        StringBuilder sb = new StringBuilder();

        int count = charBuf.length();
        for (int i = 0; i < count; i++) {
            sb.append(charBuf.get());
        }

        return sb.toString();
    }
}

Урожайность:

361926078700757358567593716803587125664654843989863967556908753816306719264539871333731967310574715835858778584708939316915516582061621172700488541380894773554695375367299711405739159440282736685351257712598020862887985249
Reversible Hash a String to BigInteger in Java
...