Java 如何检查字符串的前n个字节是否为零?

Java 如何检查字符串的前n个字节是否为零?,java,cryptography,string-hashing,Java,Cryptography,String Hashing,我试图在递增nonce的同时对消息进行散列,直到找到前4个字节为0的摘要。我该怎么做?您可以使用IntStream和limit(n)(取第一个n数字)和allMatch。像 long nonce; String message = "blahblabahlsdhqwi"; String digest = digest("SHA-256", String + nonce); byte[] digestBytes = digest.getBytes(); 或只是 int n = 4; if (In

我试图在递增nonce的同时对消息进行散列,直到找到前4个字节为0的摘要。我该怎么做?

您可以使用
IntStream
limit(n)
(取第一个
n
数字)和
allMatch
。像

long nonce;
String message = "blahblabahlsdhqwi";
String digest = digest("SHA-256", String + nonce);
byte[] digestBytes = digest.getBytes();
只是

int n = 4;
if (IntStream.range(0, digestBytes.length).limit(n)
        .allMatch(i -> digestBytes[i] == 0)) {
    // ...
}

您可以使用
IntStream
limit(n)
(取第一个
n
数字)以及
allMatch
。像

long nonce;
String message = "blahblabahlsdhqwi";
String digest = digest("SHA-256", String + nonce);
byte[] digestBytes = digest.getBytes();
只是

int n = 4;
if (IntStream.range(0, digestBytes.length).limit(n)
        .allMatch(i -> digestBytes[i] == 0)) {
    // ...
}

我花了大约两分钟半才找到:“blahblabahlsdhqwi164370510”。我在网上查了一下,确认了散列:

int n = 4;
if (IntStream.range(0, n).allMatch(i -> digestBytes[i] == 0)) {
    // ...
}
我的代码如下所示:

000000007bb0d5ef7b63faaad076fe505a112a485c83ca25af478ea1f81e33d5

我花了大约两分钟半才找到:“blahblabahlsdhqwi164370510”。我在网上查了一下,确认了散列:

int n = 4;
if (IntStream.range(0, n).allMatch(i -> digestBytes[i] == 0)) {
    // ...
}
我的代码如下所示:

000000007bb0d5ef7b63faaad076fe505a112a485c83ca25af478ea1f81e33d5

字符串
由字符组成,而不是字节,它绝对不应该包含值为
\x00
的字节。现在,如果您指的是字符
'0'
,即
\u0030
,则情况会有所不同。无论如何,如果您已将字节数据存储在
字符串中
,则应认真重新考虑
摘要()
方法的逻辑。即使我使用此方法,是否仍需要很长时间才能找到第一个字节==0的摘要<代码>公共静态字节[]DigestByte(字符串alg,字节[]bytes)引发异常{MessageDigest md=MessageDigest.getInstance(alg);字节[]buffer=bytes;md.update(buffer);字节[]digest=md.digest();返回摘要;}为0测试字节数组的前4个字节非常快,因此我不确定您的要求。您是否试图强行查找一个负载,该负载将生成一个以4个零字节开始的SHA-256摘要?是的,但即使是查找第一个字节==0也要花费很长时间,因为我也认为这会很快。字符串由字符组成,而不是字节,它绝对不应该包含值为
\x00
的字节。现在,如果您指的是字符
'0'
,即
\u0030
,则情况会有所不同。无论如何,如果您已将字节数据存储在
字符串中
,则应认真重新考虑
摘要()
方法的逻辑。即使我使用此方法,是否仍需要很长时间才能找到第一个字节==0的摘要<代码>公共静态字节[]DigestByte(字符串alg,字节[]bytes)引发异常{MessageDigest md=MessageDigest.getInstance(alg);字节[]buffer=bytes;md.update(buffer);字节[]digest=md.digest();返回摘要;}为0测试字节数组的前4个字节非常快,因此我不确定您的要求。你是在试图强行寻找一个能够产生一个从4个零字节开始的SHA-256摘要的有效载荷吗?是的,但即使是找到第一个字节==0也要花很长时间,因为我也认为它会很快。它只有4个,所以为什么不干脆
如果(digestBytes.length>=4&&digestBytes[0]==0&&digestBytes[1]==0&&digestBytes[2]==0&&digestBytes[3]==0)
if(ByteBuffer.wrap(digestBytes.getInt()==0)
是另一个选项。它很简洁,但感觉有点过分,尽管它的开销可能比使用流要小。@Andreas我假设问题的标题意味着
4
就是一个例子,它也可能是第一个
8
或第一个
32
字节,应该是
0
。这很好。我没有注意到标题中的
n
不管怎样,您看到了吗:“找到第一个字节==0的摘要会花费很长时间吗?”如果OP想要快速,则常规的
for
循环会更好,但在我看来,OP似乎在试图强制使用前导零的摘要,与摘要生成相比,流的开销很小,所以这并不重要。它只有4个,为什么不干脆
如果(digestBytes.length>=4&&digestBytes[0]==0&&digestBytes[1]==0&&digestBytes[2]==0&&digestBytes[3]==0
如果(ByteBuffer.wrap(digestBytes.getInt()==0)
是另一个选项。它很简洁,但感觉有点过分,尽管它的开销可能比使用流要小。@Andreas我假设问题的标题意味着
4
就是一个例子,它也可能是第一个
8
或第一个
32
字节,应该是
0
。这很好。我没有注意到标题中的
n
不管怎样,您看到了吗:“找到第一个字节==0的摘要会花费很长时间吗?”如果OP想要快速,则常规的
for
循环会更好,但在我看来,OP似乎在试图强制使用前导零的摘要,与摘要生成相比,流的开销很小,所以这并不重要。嘿,我找到了完全相同的一个,正要发帖,但看到了你的答案。下一个在“blahblabahlsdhqwi282915180”,花了大约三分钟才找到。嘿,我找到了完全相同的一个,正要发帖,但看到了你的答案。下一个在“blahblabahlsdhqwi282915180”,又花了三分钟才找到。