循环在构造函数中设置变量

时间:2016-06-14 04:20:04

标签: c# hash md5

我试图将变量Senha(我系统的密码)设置为原始值的md5哈希值。

public class Usuario
{
        public int ID { get; set; }
        [Required]
        public string Nome { get; set; }
        [Required]
    public string Senha {
        get { return Senha; }
        set { Console.WriteLine("valor"+value );
            this.Senha = CalculateMD5Hash(value); }
    }

    public static String CalculateMD5Hash(String input) {

            // step 1, calculate MD5 hash from input
            MD5 md5 = MD5.Create();
            byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input);
            byte[] hash = md5.ComputeHash(inputBytes);
            // step 2, convert byte array to hex string
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++) {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
    }
}

但是发生的事情是该类进入一个循环并使原始哈希值变为哈希值。

例如:value = 123

value1 = 202CB962AC59075B964B07152D234B70(值散列)

value2 = D9840773233FA6B19FDE8CAF765402F5(值为1的散列)

如何停止此循环并只触发一次该功能?

2 个答案:

答案 0 :(得分:6)

您的财产未正确定义。不仅你的setter调用自己,你的getter也调用自己,并且会导致堆栈溢出。

相反,您需要提供支持字段来存储属性的值:

private string _senha;
public string Senha 
{
    get { return _senha; }
    set 
    { 
        Console.WriteLine("valor"+value );
        _senha = CalculateMD5Hash(value);
    }
}

顺便说一下,既然您特别提到了“密码”这个词,using MD5 for passwords is a bad idea,那么除非您使用它来访问遗留系统,否则您应该真的这样做the right way

答案 1 :(得分:2)

在这种情况下,您需要使用支持字段定义属性。

private string _senha;
public string Senha 
{
    get { return _senha; }
    set { Console.WriteLine("valor"+value );
          _senha = CalculateMD5Hash(value); 
        }
}