Skip to content

Instantly share code, notes, and snippets.

@acazsouza
Last active September 28, 2016 18:22
Show Gist options
  • Save acazsouza/ac750ad7c133ee77cf6d97e61efca9db to your computer and use it in GitHub Desktop.
Save acazsouza/ac750ad7c133ee77cf6d97e61efca9db to your computer and use it in GitHub Desktop.
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