我如何比较 2 个 BigIntegers 的十六进制表示
How do I compare hex representation of 2 BigIntegers
我需要根据比特币工作量证明算法比较 sha256 哈希值。所以要求是通过设置目标难度来创建上边界,然后创建数据哈希+随机数并将其与上边界进行比较。如果此计算值小于上限,则它是有效的工作量证明。
所以这意味着我们的上限,即 target
可以定义为
var target = new BigInteger(1) << 256 - 24
当我们创建新块的哈希值时,我们将它与 target
进行比较。即
var hashInt = new BigInteger(hashBytes)
if (hashInt.CompareTo(target) == -1) {
//It is a valid hash
}
对于这个问题,我们假设值为
target
:
6901746346790563787434755862277025452451108972170386555162524223799296
hashInt
:
-50765282004551092829298895592266344483300201926640276338429566691241878315064
并且它们的十六进制值将是(通过对这些变量调用 .ToString("x")
来计算)
target
:
10000000000000000000000000000000000000000000000000000000000
hashInt
:
8fc3de5d792f2e6b3118697d1e5baa405400e9f8f09625d7eed1481ee0b09fc8
现在,当我们执行 hashInt.CompareTo(target) == -1
时,它 return 就会 true
。我完全理解为什么会这样,但我想做的是比较它们的十六进制值,如果我们能够以某种方式做到这一点,那么在比较时它将 return false
这就是我想要的。
你可以用Zip
比较两个等长的序列:
static int CompareSequenceTo<T>(this IEnumerable<T> a, IEnumerable<T> b) where T : IComparable<T> {
return a
.Zip(b, (x, y) => x.CompareTo(y))
.FirstOrDefault(r => r != 0);
}
应用于难度 a
和散列 b
,它正确地报告 a
小于 b
:
byte[] a = {0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
byte[] b = {0x8f, 0xc3, 0xde, 0x5d, 0x79, 0x2f, 0x2e, 0x6b, 0x31, 0x18, 0x69, 0x7d, 0x1e, 0x5b, 0xaa, 0x40, 0x54, 0x00, 0xe9, 0xf8, 0xf0, 0x96, 0x25, 0xd7, 0xee, 0xd1, 0x48, 0x1e, 0xe0, 0xb0, 0x9f, 0xc8};
Console.WriteLine(a.CompareSequenceTo(b)); // some value less than zero
我需要根据比特币工作量证明算法比较 sha256 哈希值。所以要求是通过设置目标难度来创建上边界,然后创建数据哈希+随机数并将其与上边界进行比较。如果此计算值小于上限,则它是有效的工作量证明。
所以这意味着我们的上限,即 target
可以定义为
var target = new BigInteger(1) << 256 - 24
当我们创建新块的哈希值时,我们将它与 target
进行比较。即
var hashInt = new BigInteger(hashBytes)
if (hashInt.CompareTo(target) == -1) {
//It is a valid hash
}
对于这个问题,我们假设值为
target
:
6901746346790563787434755862277025452451108972170386555162524223799296
hashInt
:
-50765282004551092829298895592266344483300201926640276338429566691241878315064
并且它们的十六进制值将是(通过对这些变量调用 .ToString("x")
来计算)
target
:
10000000000000000000000000000000000000000000000000000000000
hashInt
:
8fc3de5d792f2e6b3118697d1e5baa405400e9f8f09625d7eed1481ee0b09fc8
现在,当我们执行 hashInt.CompareTo(target) == -1
时,它 return 就会 true
。我完全理解为什么会这样,但我想做的是比较它们的十六进制值,如果我们能够以某种方式做到这一点,那么在比较时它将 return false
这就是我想要的。
你可以用Zip
比较两个等长的序列:
static int CompareSequenceTo<T>(this IEnumerable<T> a, IEnumerable<T> b) where T : IComparable<T> {
return a
.Zip(b, (x, y) => x.CompareTo(y))
.FirstOrDefault(r => r != 0);
}
应用于难度 a
和散列 b
,它正确地报告 a
小于 b
:
byte[] a = {0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
byte[] b = {0x8f, 0xc3, 0xde, 0x5d, 0x79, 0x2f, 0x2e, 0x6b, 0x31, 0x18, 0x69, 0x7d, 0x1e, 0x5b, 0xaa, 0x40, 0x54, 0x00, 0xe9, 0xf8, 0xf0, 0x96, 0x25, 0xd7, 0xee, 0xd1, 0x48, 0x1e, 0xe0, 0xb0, 0x9f, 0xc8};
Console.WriteLine(a.CompareSequenceTo(b)); // some value less than zero