2016-06-14 4 views
2

Я пытаюсь установить переменную Senha (пароль моей системы) в качестве хэша md5 исходного значения.Loop установка переменной в конструкторе

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(); 
    } 
} 

Но то, что происходит, заключается в том, что класс входит в цикл и создает хеши исходного хеша.

например .: значение = 123

значение1 = 202CB962AC59075B964B07152D234B70 (хэш-значения)

значение2 = D9840773233FA6B19FDE8CAF765402F5 (хэш значению1)

Как я могу остановить эту петлю и просто вызвать функцию один раз?

+0

Где вы присвоить значения для значению1 и значение2 –

+0

Так как кажется, быть редкостью в эти дни, я должен похвалить вас на самом деле с помощью отладчика, чтобы выяснить, а) происходит в петлю и б) то, что вычисляются значения. Имейте upvote. :) –

ответ

6

Свойство не определено правильно. Вы не только вызываете свой сеттер, но и ваш получатель тоже вызывает себя и вызовет переполнение стека.

Вместо этого вам необходимо предоставить поле подкладочный для хранения значения свойства:

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.

+0

Использование MD5 было просто использовать хеш. Как приложение просто учится, я думаю, это не проблема. Но для большого и коммерческого приложения я использую ваши советы. –

2

В этом случае вам необходимо определить свойство с помощью поля поддержки.

private string _senha; 
public string Senha 
{ 
    get { return _senha; } 
    set { Console.WriteLine("valor"+value); 
      _senha = CalculateMD5Hash(value); 
     } 
} 
Смежные вопросы