guid.vala 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright (c) 2012-2026 Daniele Bartolini et al.
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. namespace Crown
  6. {
  7. [Compact]
  8. public struct Guid
  9. {
  10. uint64 data1;
  11. uint64 data2;
  12. public static Guid new_guid()
  13. {
  14. // FIXME: Replace Rand with something better.
  15. Rand rnd = new Rand();
  16. uint64 a = rnd.next_int();
  17. uint64 b = rnd.next_int();
  18. uint64 c = rnd.next_int();
  19. uint64 d = rnd.next_int();
  20. uint64 d1;
  21. d1 = a << 32;
  22. d1 |= b << 0;
  23. uint64 d2;
  24. d2 = c << 32;
  25. d2 |= d << 0;
  26. d1 = (d1 & 0xffffffffffff4fffu) | 0x4000u;
  27. d2 = (d2 & 0x3fffffffffffffffu) | 0x8000000000000000u;
  28. return { d1, d2 };
  29. }
  30. public static Guid parse(string guid)
  31. {
  32. Guid g;
  33. bool success = Guid.try_parse(guid, out g);
  34. assert(success);
  35. return g;
  36. }
  37. public static bool try_parse(string str, out Guid guid)
  38. {
  39. uint32 a = 0;
  40. uint32 b = 0;
  41. uint32 c = 0;
  42. uint32 d = 0;
  43. uint32 e = 0;
  44. uint32 f = 0;
  45. int num = str.scanf("%8x-%4x-%4x-%4x-%4x%8x", &a, &b, &c, &d, &e, &f);
  46. uint64 d1;
  47. d1 = ((uint64)a) << 32;
  48. d1 |= ((uint64)b) << 16;
  49. d1 |= ((uint64)c) << 0;
  50. uint64 d2;
  51. d2 = ((uint64)d) << 48;
  52. d2 |= ((uint64)e) << 32;
  53. d2 |= ((uint64)f) << 0;
  54. guid = { d1, d2 };
  55. return num == 6;
  56. }
  57. public string to_string()
  58. {
  59. return "%.8x-%.4x-%.4x-%.4x-%.4x%.8x".printf((uint32)((data1 & 0xffffffff00000000u) >> 32)
  60. , (uint16)((data1 & 0x00000000ffff0000u) >> 16)
  61. , (uint16)((data1 & 0x000000000000ffffu) >> 0)
  62. , (uint16)((data2 & 0xffff000000000000u) >> 48)
  63. , (uint16)((data2 & 0x0000ffff00000000u) >> 32)
  64. , (uint32)((data2 & 0x00000000ffffffffu) >> 0)
  65. );
  66. }
  67. public string to_debug_string()
  68. {
  69. return "%.3x..%.3x".printf((uint)(data1 >> 52), (uint)(data2 & 0xfffu));
  70. }
  71. public static uint hash_func(Guid? id)
  72. {
  73. return (uint)(id.data1 ^ id.data2);
  74. }
  75. public static bool equal_func(Guid? a, Guid? b)
  76. {
  77. return a.data1 == b.data1
  78. && a.data2 == b.data2
  79. ;
  80. }
  81. public static int compare_func(Guid a, Guid b)
  82. {
  83. if (a.data1 != b.data1)
  84. return a.data1 < b.data1 ? -1 : 1;
  85. if (a.data2 != b.data2)
  86. return a.data2 < b.data2 ? -1 : 1;
  87. return 0;
  88. }
  89. }
  90. public const Guid GUID_ZERO = { 0u, 0u };
  91. } /* namespace Crown */