python - Can I make uuid's more random? -
i have program dispatches messages separate processes. need balance load, not in precise way, same number ok. since every message has uuid field, want uuid value. after tested uuid randomness found not random expexted. have last 1 , first 1 80% difference. unacceptable, want know if there algorithm can make more random.
here test code.
import uuid collections import counter count = 3000 def b(length): holder = [] in xrange(count): holder.append(str(uuid.uuid4())[:length]) return counter(holder) def num(part_count): sep = 0xffffffffffffffffffffffffffffffff / part_count parts = [] in xrange(count): # str_hex = str(uuid.uuid4())[:4] num = int(uuid.uuid4().hex,16) divide = num/sep if divide == part_count: divide = part_count - 1 parts.append(divide) return counter(parts) if __name__ == "__main__": print num(200) and output this:
counter({127l: 29, 198l: 26, 55l: 25, 178l: 24, 184l: 24, 56l: 23, 132l: 23, 143l: 23, 148l: 23, 195l: 23, 16l: 21, 30l: 21, 44l: 21, 53l: 21, 97l: 21, 158l: 21, 185l: 21, 13l: 20, 146l: 20, 149l: 20, 196l: 20, 2l: 19, 11l: 19, 15l: 19, 19l: 19, 46l: 19, 58l: 19, 64l: 19, 68l: 19, 70l: 19, 89l: 19, 112l: 19, 118l: 19, 128l: 19, 144l: 19, 156l: 19, 192l: 19, 27l: 18, 41l: 18, 42l: 18, 51l: 18, 54l: 18, 85l: 18, 87l: 18, 88l: 18, 93l: 18, 94l: 18, 104l: 18, 106l: 18, 115l: 18, 4l: 17, 22l: 17, 45l: 17, 59l: 17, 79l: 17, 81l: 17, 105l: 17, 125l: 17, 138l: 17, 150l: 17, 159l: 17, 167l: 17, 194l: 17, 3l: 16, 18l: 16, 28l: 16, 31l: 16, 33l: 16, 62l: 16, 65l: 16, 83l: 16, 111l: 16, 123l: 16, 126l: 16, 133l: 16, 145l: 16, 147l: 16, 163l: 16, 166l: 16, 183l: 16, 188l: 16, 190l: 16, 5l: 15, 6l: 15, 9l: 15, 23l: 15, 26l: 15, 34l: 15, 35l: 15, 38l: 15, 69l: 15, 73l: 15, 74l: 15, 77l: 15, 82l: 15, 86l: 15, 107l: 15, 108l: 15, 109l: 15, 110l: 15, 114l: 15, 136l: 15, 141l: 15, 142l: 15, 153l: 15, 160l: 15, 169l: 15, 176l: 15, 180l: 15, 186l: 15, 0l: 14, 1l: 14, 36l: 14, 39l: 14, 43l: 14, 60l: 14, 71l: 14, 72l: 14, 76l: 14, 92l: 14, 113l: 14, 131l: 14, 135l: 14, 157l: 14, 171l: 14, 172l: 14, 181l: 14, 189l: 14, 7l: 13, 17l: 13, 20l: 13, 24l: 13, 25l: 13, 32l: 13, 47l: 13, 49l: 13, 101l: 13, 102l: 13, 117l: 13, 121l: 13, 122l: 13, 124l: 13, 130l: 13, 151l: 13, 152l: 13, 165l: 13, 179l: 13, 14l: 12, 21l: 12, 29l: 12, 50l: 12, 63l: 12, 67l: 12, 80l: 12, 84l: 12, 90l: 12, 91l: 12, 96l: 12, 120l: 12, 129l: 12, 139l: 12, 140l: 12, 182l: 12, 193l: 12, 197l: 12, 52l: 11, 75l: 11, 78l: 11, 103l: 11, 116l: 11, 119l: 11, 134l: 11, 137l: 11, 161l: 11, 173l: 11, 12l: 10, 37l: 10, 66l: 10, 98l: 10, 100l: 10, 162l: 10, 170l: 10, 175l: 10, 177l: 10, 187l: 10, 191l: 10, 199l: 10, 48l: 9, 155l: 9, 164l: 9, 174l: 9, 10l: 8, 95l: 8, 99l: 8, 168l: 8, 8l: 7, 40l: 7, 57l: 7, 61l: 7, 154l: 6}) the last 1 6 first 1 29, 5 times difference
uuids not meant random, unique. if balancer needs keyed off of them, should run them through hash function first randomness want:
import hashlib actually_random = hashlib.sha1(uuid).digest()
Comments
Post a Comment