Last active
September 28, 2016 18:22
-
-
Save acazsouza/ac750ad7c133ee77cf6d97e61efca9db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using Microsoft.VisualStudio.TestTools.UnitTesting; | |
using System.Collections.Generic; | |
using System.Text; | |
using System.Security.Cryptography; | |
using System.Runtime.Serialization.Formatters.Binary; | |
using System.IO; | |
using Newtonsoft.Json; | |
namespace UnitTestProject1 | |
{ | |
[TestClass] | |
public class UnitTest1 | |
{ | |
[TestMethod] | |
public void JsonConverter_Performance_Tests() | |
{ | |
var minhaLista = new MinhaListaCustomizada(); | |
minhaLista.Add("Teste 1"); | |
minhaLista.Add(23); | |
minhaLista.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
minhaLista.Add(new MeuItemCustomizado2() | |
{ | |
Nome = "Acaz", | |
Sobrenome = "Souza" | |
}); | |
for (int i = 0; i < 10000; i++) | |
{ | |
var hashCode = JsonConvert.SerializeObject(minhaLista).GetHashCode(); | |
} | |
} | |
[TestMethod] | |
public void GetHashCode_Performance_Tests() | |
{ | |
var minhaLista = new MinhaListaCustomizada(); | |
minhaLista.Add("Teste 1"); | |
minhaLista.Add(23); | |
minhaLista.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
minhaLista.Add(new MeuItemCustomizado2() | |
{ | |
Nome = "Acaz", | |
Sobrenome = "Souza" | |
}); | |
for (int i = 0; i < 10000; i++) | |
{ | |
var hashCode = minhaLista.GetHashCode(); | |
} | |
} | |
[TestMethod] | |
public void SHA256_Performance_Tests() | |
{ | |
var minhaLista = new MinhaListaCustomizada(); | |
minhaLista.Add("Teste 1"); | |
minhaLista.Add(23); | |
minhaLista.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
minhaLista.Add(new MeuItemCustomizado2() | |
{ | |
Nome = "Acaz", | |
Sobrenome = "Souza" | |
}); | |
using (var sha256 = new SHA256Managed()) | |
{ | |
for (int i = 0; i < 10000; i++) | |
{ | |
var hash = String.Empty; | |
var objByteArr = ObjectToByteArray(minhaLista); | |
byte[] crypto = sha256.ComputeHash(objByteArr); | |
foreach (byte theByte in crypto) | |
{ | |
hash += theByte.ToString("x2"); | |
} | |
} | |
} | |
} | |
[TestMethod] | |
public void MD5_Performance_Tests() | |
{ | |
var minhaLista = new MinhaListaCustomizada(); | |
minhaLista.Add("Teste 1"); | |
minhaLista.Add(23); | |
minhaLista.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
minhaLista.Add(new MeuItemCustomizado2() | |
{ | |
Nome = "Acaz", | |
Sobrenome = "Souza" | |
}); | |
using (var md5 = MD5.Create()) | |
{ | |
for (int i = 0; i < 10000; i++) | |
{ | |
var hash = String.Empty; | |
var objByteArr = ObjectToByteArray(minhaLista); | |
byte[] crypto = md5.ComputeHash(objByteArr); | |
foreach (byte theByte in crypto) | |
{ | |
hash += theByte.ToString("x2"); | |
} | |
} | |
} | |
} | |
public static byte[] ObjectToByteArray(object obj) | |
{ | |
BinaryFormatter bf = new BinaryFormatter(); | |
using (var ms = new MemoryStream()) | |
{ | |
bf.Serialize(ms, obj); | |
return ms.ToArray(); | |
} | |
} | |
[TestMethod] | |
public void GetHashCode_Implementation_Tests() | |
{ | |
var list = new MinhaListaCustomizada(); | |
list.Add(5); | |
var list2 = new MinhaListaCustomizada(); | |
list2.Add(5); | |
list2.Add(3); | |
Assert.IsFalse(list.Equals(list2)); | |
var minhaLista1 = new MinhaListaCustomizada(); | |
minhaLista1.Add("Teste 1"); | |
minhaLista1.Add(23); | |
minhaLista1.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
minhaLista1.Add(new MeuItemCustomizado2() | |
{ | |
Nome = "Acaz", | |
Sobrenome = "Souza" | |
}); | |
var minhaLista1HashCode = minhaLista1.GetHashCode(); | |
//------------------------ | |
var minhaLista2 = new MinhaListaCustomizada(); | |
minhaLista2.Add("Teste 1"); | |
minhaLista2.Add(23); | |
minhaLista2.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
minhaLista2.Add(new MeuItemCustomizado2() | |
{ | |
Nome = "Acaz", | |
Sobrenome = "Souza" | |
}); | |
var minhaLista2HashCode = minhaLista2.GetHashCode(); | |
//------------------------ | |
Assert.AreEqual(minhaLista1HashCode, minhaLista2HashCode); | |
var minhaLista3 = new MinhaListaCustomizada(); | |
minhaLista3.Add("Teste 2"); | |
minhaLista3.Add(23); | |
minhaLista3.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
var minhaLista3HashCode = minhaLista3.GetHashCode(); | |
//------------------------ | |
var minhaLista4 = new MinhaListaCustomizada(); | |
minhaLista4.Add("Teste 2"); | |
minhaLista4.Add(24); | |
minhaLista4.Add(new MeuItemCustomizado1() | |
{ | |
ID = 1, | |
Nome = "Acaz", | |
Sobrenome = "Pereira" | |
}); | |
var minhaLista4HashCode = minhaLista4.GetHashCode(); | |
Assert.AreNotEqual(minhaLista3HashCode, minhaLista4HashCode); | |
} | |
[Serializable] | |
public class MinhaListaCustomizada : List<object> | |
{ | |
public override int GetHashCode() | |
{ | |
unchecked | |
{ | |
int hash = 17; | |
foreach (var item in this) | |
{ | |
hash = hash * 23 + item.GetHashCode(); | |
} | |
return hash; | |
} | |
} | |
public override bool Equals(object obj) | |
{ | |
var objType = obj.GetType(); | |
if (objType == typeof(MinhaListaCustomizada)) | |
{ | |
var minhaListaCustomizadaToCompare = (MinhaListaCustomizada)obj; | |
if (this.Count != minhaListaCustomizadaToCompare.Count) | |
{ | |
return false; | |
} | |
if (this.Count == 0 && minhaListaCustomizadaToCompare.Count == 0) | |
{ | |
return true; | |
} | |
var areEqual = true; | |
for (int i = 0; i < minhaListaCustomizadaToCompare.Count; i++) | |
{ | |
var minhaListaItem = this[i]; | |
var minhaListaToCompareItem = minhaListaCustomizadaToCompare[i]; | |
var minhaListaToCompareItemType = minhaListaToCompareItem.GetType(); | |
if (minhaListaToCompareItemType.IsValueType) | |
{ | |
areEqual = minhaListaItem.Equals(minhaListaToCompareItem); | |
} | |
else if (minhaListaToCompareItemType == typeof(string)) | |
{ | |
areEqual = string.Compare(minhaListaItem.ToString(), minhaListaToCompareItem.ToString(), StringComparison.OrdinalIgnoreCase) == 0; | |
} | |
else if (minhaListaToCompareItemType == typeof(MeuItemCustomizado1)) | |
{ | |
areEqual = minhaListaItem.Equals(minhaListaToCompareItem); | |
} | |
else if (minhaListaToCompareItemType == typeof(MeuItemCustomizado2)) | |
{ | |
areEqual = minhaListaItem.Equals(minhaListaToCompareItem); | |
} | |
else | |
{ | |
throw new NotImplementedException(); | |
} | |
if (!areEqual) | |
{ | |
return areEqual; | |
} | |
} | |
return base.Equals(obj); | |
} | |
else | |
{ | |
return base.Equals(obj); | |
} | |
} | |
} | |
[Serializable] | |
public class MeuItemCustomizado1 | |
{ | |
public int ID { get; set; } | |
public string Nome { get; set; } | |
public string Sobrenome { get; set; } | |
public override int GetHashCode() | |
{ | |
unchecked | |
{ | |
int hash = 17; | |
hash = hash * 23 + ID.GetHashCode(); | |
hash = hash * 23 + Nome.GetHashCode(); | |
hash = hash * 23 + Sobrenome.GetHashCode(); | |
return hash; | |
} | |
} | |
public override bool Equals(object obj) | |
{ | |
var objType = obj.GetType(); | |
if (objType == typeof(MeuItemCustomizado1)) | |
{ | |
return ((MeuItemCustomizado1)obj).ID == this.ID; | |
} | |
else | |
{ | |
return base.Equals(obj); | |
} | |
} | |
} | |
[Serializable] | |
public class MeuItemCustomizado2 | |
{ | |
public string Nome { get; set; } | |
public string Sobrenome { get; set; } | |
public override int GetHashCode() | |
{ | |
unchecked | |
{ | |
int hash = 17; | |
hash = hash * 23 + Nome.GetHashCode(); | |
hash = hash * 23 + Sobrenome.GetHashCode(); | |
return hash; | |
} | |
} | |
public override bool Equals(object obj) | |
{ | |
var objType = obj.GetType(); | |
if (objType == typeof(MeuItemCustomizado2)) | |
{ | |
return string.Compare(((MeuItemCustomizado2)obj).Nome, this.Nome, StringComparison.OrdinalIgnoreCase) == 0 | |
&& string.Compare(((MeuItemCustomizado2)obj).Sobrenome, this.Sobrenome, StringComparison.OrdinalIgnoreCase) == 0; | |
} | |
else | |
{ | |
return base.Equals(obj); | |
} | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment