Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import random, streams, strutils
- type
- GuidVariant* {.pure.} = enum
- ncs, rfc4122, microsoft, future
- GuidVersion* {.pure.} = enum
- unknown = -1
- timeBased = 1
- dceSecurity = 2
- nameBasedMd5 = 3
- randomNumberBased = 4
- nameBasedSha1 = 5
- Guid* = array[0..15, uint8]
- proc randomGuid*(): Guid =
- randomize()
- for i in 0..15: result[i] = uint8(random(255))
- # variant
- result[8] = result[8] and 0xBF'u8
- result[8] = result[8] or 0x80'u8
- # version
- result[6] = result[6] and 0x4F'u8
- result[6] = result[6] or 0x40'u8
- proc variant*(self: Guid): GuidVariant =
- if (self[8] and 0x80'u8) == 0'u8: return GuidVariant.ncs
- elif (self[8] and 0xC0'u8) == 0x80'u8: return GuidVariant.rfc4122
- elif (self[8] and 0xE0'u8) == 0xC0'u8: return GuidVariant.microsoft
- else: return GuidVariant.future
- proc version*(self: Guid): GuidVersion =
- case self[6] and 0xF0'u8
- of 0x10'u8: return GuidVersion.timeBased
- of 0x20'u8: return GuidVersion.dceSecurity
- of 0x30'u8: return GuidVersion.nameBasedMd5
- of 0x40'u8: return GuidVersion.randomNumberBased
- of 0x50'u8: return GuidVersion.nameBasedSha1
- else: return GuidVersion.unknown
- proc `==`*(lhs, rhs: Guid): bool {.inline.} =
- for i in 0..15: result = lhs[i] == rhs[i]
- proc `<`*(lhs, rhs: Guid): bool {.inline.} =
- for i in 0..15: result = lhs[i] < rhs[i]
- proc `!=`*(lhs, rhs: Guid): bool {.inline.} =
- for i in 0..15: result = lhs[i] != rhs[i]
- proc `>`*(lhs, rhs: Guid): bool {.inline.} =
- for i in 0..15: result = lhs[i] > rhs[i]
- proc `<=`*(lhs, rhs: Guid): bool {.inline.} =
- for i in 0..15: result = lhs[i] <= rhs[i]
- proc `>=`*(lhs, rhs: Guid): bool {.inline.} =
- for i in 0..15: result = lhs[i] >= rhs[i]
- proc hash*(self: Guid): int {.inline.} =
- for i in self:
- result = result xor (int(i) + int(0x9E3779B9) + (result shl 6) + (result shr 2))
- proc `$`*(self: Guid): string {.inline.} =
- result = ""
- for i in 0..15:
- result = result & int(self[i]).toHex(2)
- if (i == 3) or (i == 5) or (i == 7) or (i == 9):
- result = result & '-'
- proc readGuid*(s: Stream): Guid {.inline.} =
- s.readData(addr(result[0]), 16)
- proc writeGuid*(s: Stream, g: Guid) {.inline.} =
- s.writeData(addr(g[0]), 16)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement