我目前正在用 C++ 创建一个简单的比特币矿工,需要一些帮助来优化它的一部分。
我有一个十六进制值的字符串,由于需要在其上运行 OpenSSL sha256 哈希函数,它被解析为二进制(下面的代码)。我需要连续做 sha256 哈希,但是每次需要递增十六进制值的最后 8 个字符。
目前,我通过将二进制值转换回十六进制值,将最后 8 个字符转换为 long,递增 long,然后再次将整个转换回二进制来实现这一点,这当然是非常低效的.
递增二进制值的最佳方式是什么?
// parse an hexidemical string into a binary format
void toBytes(std::string input,unsigned char *result){
for(int i=0, j=0; i < input.size(); j++, i+=2) {
std::string twoChars = input.substr(i,2);
result[j] = (unsigned char)std::stoi(twoChars,0,16);
}
}
// converts a binary unsigned char into a hexademical string
std::string toHex(unsigned char* data, int len) {
std::string result("");
char buf[2];
int c;
c=0;
while(c < len) {
sprintf(buf,"%.2x", data[c++]);
result+=buf;
}
return result;
}
这是我当前的、非常低效的添加:
void addNonce(unsigned char * binary, int length) {
std::string hex = toHex(binary, length);
std::string nonceString = hex.substr(152,8);
long nonce = std::strtol(hex.substr(152,8).c_str(),NULL,16 );
nonce++;
char buf[8];
sprintf(buf, "%.8lx", nonce);
hex.replace(152,8,buf);
toBytes(hex,binary);
}
这是一个十六进制格式的递增示例(我需要递增一次,然后散列,再次递增,散列,直到最大值):
020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a00000000
020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051a00000001
到最大值
020000001fba9705b223d40c25b0aba35fee549aa477307862fb45ad18020000
0000000033d14883e297679e3f9a5eb108dab72ff0998e7622e427273e90027e
312ba443105315513c1f051aFFFFFFFF
最佳答案
明白了。
void addNonce(unsigned char * binary, int length) {
unsigned long *nonce = (unsigned long*) &binary[length-4];
(*nonce)++;
}
我认为这个(或非常类似的东西)就是您要找的。我不是 100% 确定数组在二进制数组中的位置,但怀疑它很好。
当 nonce 的值溢出时,它应该重置为 0。我不确定这是否是所需的行为,但是如果需要另一个结果,在 nonce 周围添加一点溢出保护应该不会太昂贵.
关于c++ - 递增二进制值(无符号字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24512958/