我对C#相当陌生(将它用于字符处理)。 如能提供帮助,将不胜感激!
我做了一个计时器,应该每分钟打印出我的哈希速度。 请参见下面的代码
using System;
using System.Text;
using System.Security.Cryptography;
namespace HashConsoleApp {
class Program {
static void Main(string[] args) {
long Nonce = 19989878659;
long Noncestart = 19989878659;
int Tick = 0;
DateTime start = DateTime.UtcNow;
while (Tick == 0) {
string noncestr = Nonce.ToString();
string plainData = "1" + noncestr + "Sjoerd0000000000000000000000000000000000000000000000000000000000000000";
string hashedData = ComputeSha256Hash(plainData);
// if 10-zeroes hash is found, save to disk
if (hashedData.Substring(0, 10) == "0000000000") {
Tick = Tick + 1;
string writestring = "Nonce: " + noncestr + "\n" + "hashed data: " + hashedData;
System.IO.File.WriteAllText("hash_10.txt", writestring);
}
// print hash speed per second, each minute
DateTime end = DateTime.UtcNow;
TimeSpan span1 = end.Subtract(start);
TimeSpan span2 = end.Subtract(start);
if (span1.Minutes >= 1) {
long diff = (int)(Nonce - Noncestart) / 60;
string diffs = diff.ToString();
Console.Write("Hash speed: " + diffs + " h/s");
System.IO.File.WriteAllText("test.txt", Nonce.ToString());
Noncestart = Nonce;
span1 = TimeSpan.Zero;
}
// save Nonce every hour, reset clock
if (span2.Minutes >= 60) {
start = DateTime.UtcNow;
System.IO.File.WriteAllText("hourly_nonce.txt", Nonce.ToString());
span2 = TimeSpan.Zero;
}
//Console.WriteLine("Raw data: {0}", plainData);
//Console.WriteLine("Hash {0}", hashedData);
//Console.WriteLine(ComputeSha256Hash("1"+noncestr+"Sjoerd0000000000000000000000000000000000000000000000000000000000000000"));
}
}
static string ComputeSha256Hash(string rawData) {
// Create a SHA256
using(SHA256 sha256Hash = SHA256.Create()) {
// ComputeHash - returns byte array
byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
// Convert byte array to a string
StringBuilder builder = new StringBuilder();
for (int i = 0; i < bytes.Length; i++) {
builder.Append(bytes[i].ToString("x2"));
}
return builder.ToString();
}
}
}
}
然而,在1分钟后,这个标记不断地在我的屏幕上打印。 它似乎卡在if语句中了。 我的代码有问题吗?
这应该为您的分钟计时器(重置minuteStart
而不是span1
):
static void Main(string[] args) {
long Nonce = 19989878659;
long Noncestart = 19989878659;
int Tick = 0;
DateTime start = DateTime.UtcNow;
DateTime minuteStart = DateTime.UtcNow; // ##### (added)
while (Tick == 0) {
// [Process stuff]
// print hash speed per second, each minute
DateTime end = DateTime.UtcNow;
TimeSpan span1 = end.Subtract(minuteStart); // ##### (modified)
if (span1.TotalMinutes >= 1) { // ##### (modified but Minutes should work fine here)
long diff = (int)(Nonce - Noncestart) / 60;
string diffs = diff.ToString();
Console.Write("Hash speed: " + diffs + " h/s");
System.IO.File.WriteAllText("test.txt", Nonce.ToString());
Noncestart = Nonce;
minuteStart = DateTime.UtcNow; // ##### (added)
//span1 = TimeSpan.Zero; // ##### (deleted)
}
// [...]
}
}
(请参阅带有//####
注释的行)
诀窍在于,由于这一行,重置span1
是没有用的:
TimeSpan span1 = end.Subtract(start);
但是,将永远不会输入if(span2.minutes>=60)
,因为timespan.minutes
“范围从-59到59”。
您可能正在此处查找totalminutes
。
您的if(span1.minutes>=1){
语句并不意味着打印输出每分钟只发生一次,它只会在程序启动后至少过了一分钟后才进行打印。
您需要检查从上次打印输出到现在是否已经过了1分钟。 因此,每次运行打印输出时都需要重置开始时间。 (注意,像现在这样设置span1=timespan.zero
没有效果,因为只要循环再次运行就会覆盖它)。
此外,一旦您这样做,您的分钟和小时测试将相互冲突,因此您需要单独的日期计数器。
因此添加
DateTime start2 = DateTime.UtcNow;
就在声明start
已经的行下面。
则请将span1=TimeSpan.Zero;
替换为
start2 = DateTime.UtcNow;
并更改timeSpan span1=end.subtract(start);
至
TimeSpan span1 = end.Subtract(start2);
最后,将if(span2.minutes>=60){
替换为
if (span2.TotalMinutes >= 60) {
否则,此部分也不会工作,因为分钟
只报告当前小时的分钟数。 您还可以删除span2=TimeSpan.zero;
,这与第一个if
块中的类似行一样是多余的。