Hash.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. // Copyright (c) 2008-2023 the Urho3D project
  2. // License: MIT
  3. #pragma once
  4. #include "../Base/PrimitiveTypes.h"
  5. #include <cstddef>
  6. namespace Urho3D
  7. {
  8. /// Combine hash into result value.
  9. inline void CombineHash(hash32& result, hash32 hash)
  10. {
  11. result ^= hash + 0x9e3779b9 + (result << 6) + (result >> 2);
  12. }
  13. /// Pointer hash function.
  14. template <class T> hash32 MakeHash(T* value)
  15. {
  16. return (hash32)((size_t)value / sizeof(T));
  17. }
  18. /// Const pointer hash function.
  19. template <class T> hash32 MakeHash(const T* value)
  20. {
  21. return (hash32)((size_t)value / sizeof(T));
  22. }
  23. /// Generic hash function.
  24. template <class T> hash32 MakeHash(const T& value)
  25. {
  26. return value.ToHash();
  27. }
  28. /// Void pointer hash function.
  29. template <> inline hash32 MakeHash(void* value)
  30. {
  31. return (hash32)(size_t)value;
  32. }
  33. /// Const void pointer hash function.
  34. template <> inline hash32 MakeHash(const void* value)
  35. {
  36. return (hash32)(size_t)value;
  37. }
  38. /// Long long hash function.
  39. template <> inline hash32 MakeHash(const i64& value)
  40. {
  41. return (hash32)((value >> 32u) | (value & 0xffffffffu));
  42. }
  43. /// Unsigned long long hash function.
  44. template <> inline hash32 MakeHash(const u64& value)
  45. {
  46. return (hash32)((value >> 32u) | (value & 0xffffffffu));
  47. }
  48. /// Int hash function.
  49. template <> inline hash32 MakeHash(const i32& value)
  50. {
  51. return (hash32)value;
  52. }
  53. /// Unsigned hash function.
  54. template <> inline hash32 MakeHash(const u32& value)
  55. {
  56. return value;
  57. }
  58. /// Short hash function.
  59. template <> inline hash32 MakeHash(const i16& value)
  60. {
  61. return (hash32)value;
  62. }
  63. /// Unsigned short hash function.
  64. template <> inline hash32 MakeHash(const u16& value)
  65. {
  66. return value;
  67. }
  68. /// Char hash function.
  69. template <> inline hash32 MakeHash(const char& value)
  70. {
  71. return (hash32)value;
  72. }
  73. /// Unicode code point hash function.
  74. template <> inline hash32 MakeHash(const c32& value)
  75. {
  76. return (hash32)value;
  77. }
  78. /// Unsigned char hash function.
  79. template <> inline hash32 MakeHash(const u8& value)
  80. {
  81. return value;
  82. }
  83. /// Signed char hash function.
  84. template <> inline hash32 MakeHash(const i8& value)
  85. {
  86. return value;
  87. }
  88. }