如果语句不断触发

时间:2020-06-08 13:46:39

标签: c# if-statement

我对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语句中。我的代码有问题吗?

2 个答案:

答案 0 :(得分:1)

这应该可以解决您的分钟计时器问题(重置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

答案 1 :(得分:1)

您的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) {

否则,该部分将不起作用,因为Minutes仅报告当前小时的分钟数。您也可以删除span2 = TimeSpan.Zero;,这很多余,就像第一个if块中的类似行一样。