Algorithm 基于GUID拆分测试组

Algorithm 基于GUID拆分测试组,algorithm,guid,Algorithm,Guid,系统中的用户由GUID标识,通过一个新特性,我想将用户分为两组-测试和控制 有没有一种简单的方法可以根据用户的GUID将用户分成两组中有50/50机会的一组 e、 g.如果第n个字符的ascii码是奇数->测试组,则为控制组 70/30或者其他比例呢 我之所以想根据GUID对用户进行分类,是因为以后我可以很容易地判断哪些用户属于哪个组,并比较两个组之间的性能,不必跟踪组分配-我只需再次计算它。如果GUID中的某个字符的16分之一更改为以下字符之一:“0123456789ABCEDF”,那么您可能

系统中的用户由GUID标识,通过一个新特性,我想将用户分为两组-测试和控制

有没有一种简单的方法可以根据用户的GUID将用户分成两组中有50/50机会的一组

e、 g.如果第n个字符的ascii码是奇数->测试组,则为控制组

70/30或者其他比例呢


我之所以想根据GUID对用户进行分类,是因为以后我可以很容易地判断哪些用户属于哪个组,并比较两个组之间的性能,不必跟踪组分配-我只需再次计算它。

如果GUID中的某个字符的16分之一更改为以下字符之一:“0123456789ABCEDF”,那么您可能可以测试一个通过该字符确定位置的方案

假设guid的最后一个名为c的字符有1/16的几率为任何十六进制数字:

对于50/50分配->第2组的C7

第2组为70/30 c A


等等。

正如Derek Li所指出的,GUID的位可能基于时间戳,因此您不应该直接使用它们

最安全的解决方案是使用如下哈希函数对GUID进行哈希。这将生成一个随机数(但对于任何给定的GUID,每次都是相同的随机数),然后可以使用该随机数进行拆分

例如,您可以这样进行30/70分割:

function isInTestGroup(user) {
    var hash = murmurHash(user.guid);
    return (hash % 100) < 30; 
}
函数ISINTESTGOUP(用户){
var hash=furrushash(user.guid);
返回值(散列%100)<30;
}

如果你说“机会”意味着最终结果可能不完全等于你想要的比率?假设只生成随机数,看看它是奇数还是偶数?它不需要精确到50/50,就像随机生成100个0和1并不意味着你将得到50个0和50个1。所以,如果随机数是奇数,只需将用户放入A组;否则,是否要组B?从GUID生成一个8位CRC,然后根据CRC的值选择组。任何像样的哈希函数(如8位CRC)都应该可以。如果guid是从系统时钟派生的,那么低阶位应该是大致随机的(尽管您不知道低变化位在哪里,因为您不知道系统时钟的精度)。另一种可能性是guid是从随机数生成器派生出来的,在这种情况下,相当多的位实际上是随机的。在任何一种情况下,任何合适的散列函数都应该给你一个分布相当均匀的输出,你可以使用一个由该函数寻址的查找表来给你任何你想要的分割。是的,但是十六进制数字中的哪一个,或者哪一个位是最好的?例如,.NET guid生成器将根据时间戳设置前60位,最后48位是计算机网卡的唯一地址,前两位始终为01。所以并非所有的位都是相等的,是吗?:)如果您取guid的字符之和,(简短的示例“43AC”=4+3+10+12=29),然后模16(29%16=13),那么结果是13'D'?那就以此为基础?或者,只要总和在该范围内均匀分布,任何类型的模方案都可能有效。我看到其他用户注意到,随机数生成器可以满足这个问题,除非有理由要求GUI提供随机性。这样我就不需要跟踪哪个用户在哪个组中,当我稍后尝试比较两组之间的性能时。