前一段时间我尝试为orcaman/concurrent-map实现泛型的支持时,遭遇到为任意类型计算哈希值的问题,现在这个库也自己实现了泛型支持,你也可以看到它的哈希也没有好的办法,只能提供出一个函数对象让用户自己实现。当然你也可以参考[cornelk/hashmap/blob/36b3b9c2b7ec993f1ef12a6957d45826aca726e6/util_hash.go#L49)中的实现,但是它的实现既不全面也不高效?
我们经常会在一些场景,比如特定的数据结构、cache等场景中使用这样一个哈希函数,那么如何为任务类型实现一个优雅高效的hash函数呢?其实Go运行时中map中就实现了。回想一下内建的map是不是支持泛型的?它的key可以是comparable类型(包括接口类型),内部实现中会把此类型的key计算一个哈希值,能不能吧它的hash函数拿出来使用?很遗憾,Go官方并没有想暴露出来这样的hasher的想法,它的代码也是不容易抽取整理成一个hasher函数。
今天看到一篇文章Hacking Go's Runtime with Generics,提供了一种方法,脑洞大开。没看之前确实没想到,看到之后才发觉这么简单有效,接下来我翻译了这么文章,赶快学习吧。
