StringHash.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using NUnit.Framework;
  2. namespace Urho.Tests
  3. {
  4. [TestFixture]
  5. public class StringHashTests
  6. {
  7. [Test]
  8. public void HashAlgorithm()
  9. {
  10. string alphabet = "QWERTYUIOPASDFGHJKLZXCVBNM_qwertyuiopasdfghjklzxcvbnm";
  11. string value = "";
  12. for (int i = 0; i < 10000; i++)
  13. {
  14. int codeNative = new StringHash(value).Code;
  15. int codeManaged = GetHashManaged(value);
  16. Assert.AreEqual(codeManaged, codeNative);
  17. value += alphabet[i % alphabet.Length];
  18. }
  19. }
  20. [Test]
  21. public void EqualityTest()
  22. {
  23. var hash1 = new StringHash(123);
  24. var hash2 = new StringHash(123);
  25. var hash3 = new StringHash(124);
  26. var hash4 = new StringHash(0);
  27. var hash5 = new StringHash("Hello");
  28. Assert.IsTrue(hash1 == hash2);
  29. Assert.IsTrue(hash1 != hash3);
  30. Assert.IsTrue(hash1 != hash4);
  31. Assert.IsTrue(hash1 != hash5);
  32. Assert.IsTrue(hash1.Equals(hash2));
  33. Assert.IsTrue(!hash1.Equals(hash3));
  34. Assert.IsTrue(hash1.GetHashCode() == hash2.GetHashCode());
  35. Assert.IsTrue(hash1.GetHashCode() != hash3.GetHashCode());
  36. }
  37. // let's just check the hash algorithm was not changed.
  38. static int GetHashManaged(string str)
  39. {
  40. int hash = 0;
  41. if (string.IsNullOrEmpty(str))
  42. return 0;
  43. for (int i = 0; i < str.Length; i++)
  44. hash = char.ToLowerInvariant(str[i]) + (hash << 6) + (hash << 16) - hash;
  45. return hash;
  46. }
  47. }
  48. }