基于 GUID 拆分测试组
Split test groups base on GUID
系统中的用户是通过GUID来标识的,而且有一个新特性,我想把用户分成两组——测试和控制。
有没有一种简单的方法可以根据用户的 GUID 以 50/50 的概率将用户分成两组?
例如如果第n个字符的ascii码是奇数->测试组,否则是控制组。
70/30 或其他比例怎么样?
我之所以要根据 GUID 对用户进行分类,是因为以后我可以很容易地分辨出哪些用户在哪个组中并比较两个组之间的性能,而不必跟踪组分配 - 我只需要重新计算。
如果 GUID 中的某个字符每 16 个字符中就有 1 个变为以下字符之一:“0123456789ABCEDF”,那么也许您可以测试一个确定该字符位置的方案。
假设名为 c 的 guid 的最后一个字符有 1/16 的机会是任何十六进制数字:
对于 50/50 分布 -> c <= 7 对于第 1 组,c > 7 对于第 2 组
for 70/30 c <= A for group 1, c > A for group 2
等...
正如 Derek Li 所指出的,GUID 的位可能基于时间戳,因此您不应直接使用它们。
最安全的解决方案是使用像 MurmurHash 这样的哈希函数对 GUID 进行哈希处理。这将产生一个随机数(但是对于任何给定的 GUID,每次都是 相同的 随机数),然后您可以使用它来进行拆分。
例如,您可以像这样进行 30/70 分割:
function isInTestGroup(user) {
var hash = murmurHash(user.guid);
return (hash % 100) < 30;
}
系统中的用户是通过GUID来标识的,而且有一个新特性,我想把用户分成两组——测试和控制。
有没有一种简单的方法可以根据用户的 GUID 以 50/50 的概率将用户分成两组?
例如如果第n个字符的ascii码是奇数->测试组,否则是控制组。
70/30 或其他比例怎么样?
我之所以要根据 GUID 对用户进行分类,是因为以后我可以很容易地分辨出哪些用户在哪个组中并比较两个组之间的性能,而不必跟踪组分配 - 我只需要重新计算。
如果 GUID 中的某个字符每 16 个字符中就有 1 个变为以下字符之一:“0123456789ABCEDF”,那么也许您可以测试一个确定该字符位置的方案。
假设名为 c 的 guid 的最后一个字符有 1/16 的机会是任何十六进制数字:
对于 50/50 分布 -> c <= 7 对于第 1 组,c > 7 对于第 2 组
for 70/30 c <= A for group 1, c > A for group 2
等...
正如 Derek Li 所指出的,GUID 的位可能基于时间戳,因此您不应直接使用它们。
最安全的解决方案是使用像 MurmurHash 这样的哈希函数对 GUID 进行哈希处理。这将产生一个随机数(但是对于任何给定的 GUID,每次都是 相同的 随机数),然后您可以使用它来进行拆分。
例如,您可以像这样进行 30/70 分割:
function isInTestGroup(user) {
var hash = murmurHash(user.guid);
return (hash % 100) < 30;
}