您能否使用 ++ 运算符递增长文字并访问 java 中的整个长文字范围?
Can you increment a long literal using the ++ operator and have access to the whole long literal range in java?
我正在写一个临时的小私人 'block chain' 用于说明目的,用作教学工具。我已经解决了所有核心功能,但我在考虑区块链的一些更特殊的方面,发现自己对 java 中的多头感到疑惑。我在应用程序中内置的 'miner' 方法使用 ++ 运算符递增 long 类型的现时值,直到满足条件。我的问题是,如果我想避免(或至少大大延长)耗尽整数 nonce space (2147483647) 的机会,如果我初始化了起始 nonce 值,我将 Nonce = 0L 传递给 miner 方法;我可以用 ++ 运算符递增它并使用完整的长文字范围吗?
据我了解,比特币在交易中使用特殊的输入值,and/or 一些矿工会略微更改 "ExtraNonce" 的时间戳,但由于这只是为了说明目的,我不想要尽可能地在应用程序中包含类似的东西。
如果有人出于任何原因想要查看它们,我可以提供代码片段,任何想法将不胜感激!
代码如下:
(请不要在我有问题的 if/else 控制逻辑上质问我,这不是合法的生产应用程序,我在 java 中仍然是新手)
这是启动器 class 调用矿工方法的代码:
} 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);
是的,long ++ 将使用指令集 ladd
(iadd
用于 int)。
因为你的问题随着你的编辑而完全改变了,我仍然看到它..
cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);
如果您像这样传递 0
,它将被视为 int
,因此您只能将 MAX_INTEGER
放在那里,尽管方法参数接受 long
(它将在方法主体中被这样对待)。
++
运算符在 long
变量上按预期工作。
我正在写一个临时的小私人 'block chain' 用于说明目的,用作教学工具。我已经解决了所有核心功能,但我在考虑区块链的一些更特殊的方面,发现自己对 java 中的多头感到疑惑。我在应用程序中内置的 'miner' 方法使用 ++ 运算符递增 long 类型的现时值,直到满足条件。我的问题是,如果我想避免(或至少大大延长)耗尽整数 nonce space (2147483647) 的机会,如果我初始化了起始 nonce 值,我将 Nonce = 0L 传递给 miner 方法;我可以用 ++ 运算符递增它并使用完整的长文字范围吗?
据我了解,比特币在交易中使用特殊的输入值,and/or 一些矿工会略微更改 "ExtraNonce" 的时间戳,但由于这只是为了说明目的,我不想要尽可能地在应用程序中包含类似的东西。
如果有人出于任何原因想要查看它们,我可以提供代码片段,任何想法将不胜感激!
代码如下:
(请不要在我有问题的 if/else 控制逻辑上质问我,这不是合法的生产应用程序,我在 java 中仍然是新手)
这是启动器 class 调用矿工方法的代码:
} 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);
是的,long ++ 将使用指令集 ladd
(iadd
用于 int)。
因为你的问题随着你的编辑而完全改变了,我仍然看到它..
cb.miner(indexValue, timeStamp, data, 0, previousHash, 5);
如果您像这样传递 0
,它将被视为 int
,因此您只能将 MAX_INTEGER
放在那里,尽管方法参数接受 long
(它将在方法主体中被这样对待)。
++
运算符在 long
变量上按预期工作。