基于hash的AB测试

Posted typeck

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于hash的AB测试相关的知识,希望对你有一定的参考价值。

AB测试

为同一个目标,设计两种方案,将两种方案随机投放市场中,让组成成分相同(相似)用户去随机体验两种方案之一,根据观测结果,判断哪个方案效果更好。

基于hash的AB测试

具体的实现方法为:
在AB测试中需要将用户随机的分成两组,通过对每个用户唯一id做hash运算,并对hash值对2取模,便可以将用户分成0,1两组(分桶测试便是hahs对n取模)。
每组采用不同的策略,并定义一个策略Id,跟随不同的策略埋点,在最后回收策略Id,最后通过策略id分析ab两种策略的好坏。

golang中的hash

在golang中的标准库中实现了fnv、sha1、sha256、sha512四种哈希函数。其中fnv是简单的非加密hash函数。
golang中提供了同一的hash接口:

  • type Hash
type Hash interface {
    // 通过嵌入的匿名io.Writer接口的Write方法向hash中添加更多数据,永远不返回错误
    io.Writer
    // 返回添加b到当前的hash值后的新切片,不会改变底层的hash状态
    Sum(b []byte) []byte
    // 重设hash为无数据输入的状态
    Reset()
    // 返回Sum会返回的切片的长度
    Size() int
    // 返回hash底层的块大小;Write方法可以接受任何大小的数据,
    // 但提供的数据是块大小的倍数时效率更高
    BlockSize() int
}
  • type?Hash32?
type Hash32 interface {
    Hash
    Sum32() uint32
}
  • type Hash64
type Hash64 interface {
    Hash
    Sum64() uint64
}

以上四种hash运算便是实现了这个接口。
以fnv为例:

h := fnv.New64()
h.Write([]byte(userId))
i := h.Sum64()
if i%2 != 0{
    Strategy a ...
}else{
    Strategy b ...
}

以上是关于基于hash的AB测试的主要内容,如果未能解决你的问题,请参考以下文章

短链系统设计性能优化-分片策略优化

SPA路由实现的基本原理

如何从URL获取片段标识符(hash#之后的值)?

聊一聊基于Nacos的metadata完成服务间的AB测试

聊一聊基于Nacos的metadata完成服务间的AB测试

LinuxApacheBench(ab)压力测试工具