Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我可以制作uuid';什么更随机?_Python_Algorithm_Load Balancing_Uuid - Fatal编程技术网

Python 我可以制作uuid';什么更随机?

Python 我可以制作uuid';什么更随机?,python,algorithm,load-balancing,uuid,Python,Algorithm,Load Balancing,Uuid,我有一个程序,可以将消息发送到不同的进程。我需要平衡负载,但不是以非常精确的方式,几乎相同的数字是可以的。因为每条消息都有一个uuid字段,所以我想通过uuid值来完成。在我测试了uuid的随机性之后,我发现它不像我想象的那样随机。我有最后一个和第一个大约80%的差异。这是不可接受的,所以我想知道是否有一种算法可以使它更随机 这是我的测试代码 import uuid from collections import Counter COUNT = 3000 def b(length):

我有一个程序,可以将消息发送到不同的进程。我需要平衡负载,但不是以非常精确的方式,几乎相同的数字是可以的。因为每条消息都有一个uuid字段,所以我想通过uuid值来完成。在我测试了uuid的随机性之后,我发现它不像我想象的那样随机。我有最后一个和第一个大约80%的差异。这是不可接受的,所以我想知道是否有一种算法可以使它更随机

这是我的测试代码

import uuid
from collections import Counter

COUNT = 3000

def b(length):
    holder = []
    for i in xrange(COUNT):
        holder.append(str(uuid.uuid4())[:length])
    return Counter(holder)

def num(part_count):
    sep = 0xffffffffffffffffffffffffffffffff / part_count
    parts = []
    for i 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) 
我得到如下输出:

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})

最后一个是6,第一个是29,几乎是差异的5倍

你的测试方法没有任何意义(见下文)。但首先,这是uuid4的实现:

def uuid4():
    """Generate a random UUID."""

    # When the system provides a version-4 UUID generator, use it.
    if _uuid_generate_random:
        _buffer = ctypes.create_string_buffer(16)
        _uuid_generate_random(_buffer)
        return UUID(bytes=_buffer.raw)

    # Otherwise, get randomness from urandom or the 'random' module.
    try:
        import os
        return UUID(bytes=os.urandom(16), version=4)
    except:
        import random
        bytes = [chr(random.randrange(256)) for i in range(16)]
        return UUID(bytes=bytes, version=4)
libuuid
(调用
ctypes
)、
os.urandom
randrandRange
返回的随机性对于大多数非加密的东西来说应该足够好了

编辑:好吧,我猜为什么你的测试方法被打破了:你正在计算的数字(
除以
)有两种偏差:首先,它是除以一个不是二的幂的数字(在本例中是200)的结果,这引入了模偏差。其次,如果divide==part\u count:divide=part\u count-1引入了更多的偏差


此外,在解释结果之前,您需要弄清楚任何随机数生成器测试的置信区间是多少。我的统计数据在这里不是很好,所以我真的不能帮你…

只是因为有些东西看起来不是随机的,并不意味着它不是随机的

也许在人的眼睛(和头脑)看来,有些序列看起来不像其他序列那么随机,但事实并非如此。 当你掷骰子10次时,掷2-5-1-3-5-1-3-5-2-6的概率与掷1-1-1-1-1-1-1或1-2-3-4-5-6-1-2-3-4的概率一样高。尽管后两个例子似乎不那么随机,但事实并非如此

不要试图改进随机生成器,因为很可能只会使输出恶化


例如:您想要生成一个随机序列,但它看起来不够随机,以至于一个字节比另一个字节出现得更频繁。因此,为了确保更大的随机性,您可以消除所有重复字节(或重复超过n次的字节)的序列。实际上,您正在减少序列的随机性。

UUID不是随机的,只是唯一的。如果需要为平衡器设置关键帧,它应首先通过哈希函数运行它们,以获得所需的随机性:

import hashlib
actually_random = hashlib.sha1(uuid).digest()

UUID不应该是随机的,它应该是唯一的:通常,它基于计算机名/ip、日期之类的东西:目标不是使其随机,目标是确保两个连续调用将提供两个不同的值,并且来自不同计算机的Id不会冲突。如果您想了解更多详细信息,可以查看


现在,如果您的负载平衡器想将其作为平衡的标准,我认为您的设计是有缺陷的。如果您想从中获得更好的随机性,可以对其进行散列(如sha-256),从而稀释所有位中的小随机性(这就是散列所做的)

那么您是说您需要生成不同外观的uuid,因为您有一些算法无法正确地将uuid分配给不同的处理器?如果是这样的话,也许你需要一个更好的负载平衡器,而不是一个新的uuid生成器。你的垃圾箱将作为一个正态分布被填满/命中。你所看到的正是你对正态分布数字的期望。随着采样数的增加,此效果将不太明显。对于300000个样本,我得到了1290个最常见的样本和1079个最不常见的样本。这不是一个很糟糕的问题。他提供了足够的信息来解决他的错误假设。对于一些语法和格式的foo,这可能是一个不错的问题。uid不能保证是随机数,只是唯一的。请看“没有多少随机性的东西。”这完全不是真的。参见,例如:@David这描述了伪随机生成器的质量。现在,当你开始过滤“随机外观”的输出时,请给我举出一个输出改善的生成器。我的评论不是针对你关于“随机外观”的陈述,而是针对你声称的“不存在或多或少随机的东西”。但是,您似乎已将其编辑掉,因此我的评论不再有效。“UUID不是随机的,只是唯一的”-这是一个很好的观点,但对UUIDs来说并不完全正确:。UUID4是随机的,除了一个半字节是4,另一个半字节是8、9、A或B中的一个。@David就UUIDs的用途而言,这一点是准确的。随机值只是实现唯一性的一种方式(具有一定程度的确定性)。良好分布当然不是UUID的目标。啊,非常正确。我被随机数的刺激迷住了,我想我忘了读了…谢谢你们给了我很多方法来重新思考我的问题:D,我最终放弃了使用uuid作为平衡键的想法。另外,正如我在@j'B的评论中注意到的,UUID4有一个字节不是随机的(半个字节总是
4
,半个字节总是
8
9
A
,或
B
)中的一个。另外,有关随机数生成器所进行的“实”测试的更多信息,请参阅:David:或这会使许多死硬通过的生成器也失败。