Можете ли вы увеличить длинный литерал с помощью оператора ++ и получить доступ ко всему диапазону длинных литералов в java?

Я пишу импровизированную маленькую частную «цепочку блоков» в иллюстративных целях, чтобы использовать ее в качестве учебного пособия. У меня есть все основные функциональные возможности, но я думал о некоторых наиболее специфических аспектах цепочки блоков и обнаружил, что задаюсь вопросом о longs в java. Метод «майнера», который я встроил в приложение, увеличивает одноразовое значение типа long с помощью оператора ++ до тех пор, пока не будет выполнено условие. Мой вопрос заключается в том, что если бы я хотел избежать (или, по крайней мере, значительно продлить) вероятность исчерпания пространства целочисленного одноразового номера (2147483647), если я инициализировал начальное значение одноразового номера, которое я передал бы методу майнера с Nonce = 0L; могу ли я увеличить его с помощью оператора ++ и использовать полный диапазон длинных литералов?

Насколько я понимаю, Биткойн использует специальное входное значение в транзакции, и/или некоторые майнеры немного меняют отметку времени для «ExtraNonce», но, поскольку это просто для иллюстративных целей, я не хочу заходить так далеко, чтобы включать что-то подобное. в приложение.

Я могу предоставить фрагменты кода, если кто-то хочет их увидеть по какой-либо причине, любые мысли будут очень признательны!

Код ниже:

(пожалуйста, не перебивайте меня моей сомнительной логикой управления if/else, это не законное производственное приложение, и я все еще новичок в java)

Это код из класса запуска, который вызывает метод майнера:

 } else if (cliInput.contentEquals("mine")) {
                Scanner howMany = new Scanner(System.in);
                System.out.println("\n");
                System.out.println("Enter number of blocks to mine: \n");
                int howManyBlocks = howMany.nextInt();
                int numBlocksMined = 0;
                while (howManyBlocks >= numBlocksMined) {
                    MainChain mc = new MainChain();
                    long indexValue = (HashArray.hashArray.size() / 8);
                    long timeStamp = mc.getUnixTimestamp();
                    String data = helpers.SHA256.generateHash(pubKey + addressKey);
                    String previousHash = mc.getPreviousBlockHash();
                    ChainBuilder cb = new ChainBuilder();
                    cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);
                    numBlocksMined++;
                }

Вот суть метода майнера:

public void miner(long index, long currentTimeMillis, String data, long Nonce, String previousBlockHash, int difficulty) throws InterruptedException {
        this.index = index;
        this.currentTimeMillis = currentTimeMillis;
        this.pszTimeStamp = pszTimeStamp;
        this.Nonce = Nonce;
        this.previousBlockHash = previousBlockHash;
        this.difficulty = difficulty;
        this.data = data;
        boolean iterator = true;

        String blockHeader = (index + currentTimeMillis + data + Nonce + previousBlockHash + difficulty);
        String hash = SHA256.generateHash(blockHeader);

        startTime = System.nanoTime();
        TimeUnit.SECONDS.sleep(1);
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("\n");
                System.out.println("Current hash rate: " + hashRate + " " + "hash/s");
            }
        }, 0, 3000);

        while (iterator) {
            blockHeader = (index + currentTimeMillis + data + Nonce + previousBlockHash + difficulty);
            hash = SHA256.generateHash(blockHeader);
            if (difficulty == 1) {

                if (!hash.startsWith("0")) {
                    Nonce++;
                    endTime = System.nanoTime();
                    deltaN = endTime - startTime;
                    deltaS = (deltaN / 1000000000);
                    hashRate = (Nonce / deltaS);

                } else {
                    System.out.println("Hash found!");
                    System.out.println("[" + hash + "]");
...............

Мне интересно, если я передам методу майнера 0L вместо 0, получу ли я доступ ко всему диапазону?

Итак, вместо:

cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);

Могу ли я передать это так, чтобы использовать весь длинный буквальный диапазон?

cb.miner(indexValue, timeStamp, data, 0L, previousHash, 5);

не могли бы вы поделиться кодом?

javapedia.net 07.04.2019 01:15

Если метод майнера принимает целое число, передача 0L не имеет смысла. Пожалуйста, расширьте, что вы имеете в виду.

Elliott Frisch 07.04.2019 01:17

Я добавил фрагменты кода. Nonce имеет тип long, но насколько я понимаю, если вы явно не укажете компилятору, что это длинный литерал с суффиксом «L», он будет иметь тот же диапазон, что и целое число.

apt-getschwifty 07.04.2019 01:28

Столько текста и столько кода для такого тривиального вопроса. Ответ в том, что произошло, когда вы попробовали это. Не делайте из мухи слона.

user207421 07.04.2019 02:51

Я новичок в java, и, честно говоря, я изначально не публиковал код с ним, кто-то запросил его, я просто хотел убедиться, что в том, что я говорил, есть контекст, поскольку кто-то сразу же попросил код ... поэтому я не на самом деле не думаю, что это заслуживает того, чтобы за него проголосовали, тем более что вопрос действительно показал некоторые исследовательские усилия. Но, увы, это сработало, и я получил ответ, который принял.

apt-getschwifty 07.04.2019 04:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
2 267
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, для long++ будет использоваться набор инструкций ladd (iadd для int).

См. 6.5 Инструкция#s#ladd


Поскольку ваш вопрос полностью изменился с вашим редактированием, и я все еще видел его.

cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);

Если вы передадите 0 таким образом, он будет рассматриваться как int, поэтому вы можете поместить туда только MAX_INTEGER, хотя параметр метода принимает long (он будет рассматриваться как таковой в теле метода).

Ура, ты опередил меня с ответом на минуту.

Benjamin Urquhart 07.04.2019 01:26

Ха-ха, мой вопрос не полностью изменился, я просто не знал, передается ли одноразовый номер с суффиксом «L» (что делает его длинным литералом), если вы все еще можете увеличить его с помощью оператора ++. Отсюда и заголовок: «Можете ли вы увеличить длинный литерал с помощью оператора ++». Спасибо всем за супер оперативные ответы! Я обновил заголовок для ясности. (:

apt-getschwifty 07.04.2019 01:34

Оператор ++ работает, как и ожидалось, с long переменными.

Другие вопросы по теме