Advertisement
Guest User

Untitled

a guest
Oct 17th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. alphanum = b"_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  2. anl = len(alphanum)+1
  3. c = 0xFFFFFFFFFFFFFFFF
  4. e = anl-10
  5. d = 0
  6. while e<c:
  7. d += 1
  8. e *= anl
  9. print(anl, "chars")
  10. print(d, "max length for 64 bits")
  11. alphanumc = [ None for i in range(256) ]
  12. for v, k in enumerate(alphanum):
  13. alphanumc[k] = v+1
  14.  
  15. def encode(s):
  16. r = 0
  17. if not s:
  18. return r
  19. if s[0] in b"0123456789":
  20. raise RuntimeError("name cannot start with a digit")
  21. for c in s:
  22. r *= anl
  23. r += alphanumc[c]
  24. return r
  25.  
  26. def decode(s):
  27. r = []
  28. while s:
  29. s, n = divmod(s, anl)
  30. r.append(alphanum[n-1:n])
  31. return b"".join(r[::-1])
  32.  
  33. s = b"hookovercrookthroughbooze"
  34.  
  35. print(decode(encode(s)))
  36.  
  37.  
  38. from collections.abc import MutableMapping
  39. class Node(MutableMapping):
  40. def __init__(self):
  41. self.children = [None, None]
  42. def __getitem__(self, key):
  43. data = self.children[key&1]
  44. if isinstance(data, Node):
  45. return data[key>>1]
  46. else:
  47. return data
  48. def __setitem__(self, key, value):
  49. data = self.children[key&1]
  50. if isinstance(data, Node):
  51. data[key>>1] = value
  52. elif key < 2:
  53. self.children[key&1] = value
  54. else:
  55. self.children[key&1] = Node()
  56. self.children[key&1][0] = data
  57. self.children[key&1][key>>1] = value
  58. def __delitem__(self, key):
  59. data = self.children[key&1]
  60. if isinstance(data, Node):
  61. data[key>>1] = None
  62. elif key < 2:
  63. self.children[key&1] = None
  64. def __iter__(self):
  65. def it():
  66. for k, v in enumerate(self.children):
  67. if isinstance(v, Node):
  68. for sk in iter(v):
  69. yield (sk<<1)|k
  70. elif v is not None:
  71. yield k
  72. return it()
  73. def __len__(self):
  74. return len([k for k in iter(self)])
  75.  
  76. class MyMapping(Node):
  77. def __init__(self, d=None):
  78. Node.__init__(self)
  79. if d is not None:
  80. for k in d:
  81. self[k] = d[k]
  82. def __getitem__(self, key):
  83. return Node.__getitem__(self, encode(key))
  84. def __setitem__(self, key, value):
  85. Node.__setitem__(self, encode(key), value)
  86. def __delitem__(self, key):
  87. Node.__delitem__(self, encode(key))
  88. def __iter__(self):
  89. def it():
  90. for k in Node.__iter__(self):
  91. yield decode(k)
  92. return it()
  93.  
  94. test = MyMapping({b"mykey": b"myvalue"})
  95. test[b"myanotherkey"] = b"myanothervalue"
  96. print(test[b"mykey"])
  97. for k in test:
  98. print(k, test[k])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement