【发布时间】:2012-12-13 08:28:24
【问题描述】:
如果有一个枚举存储在聚合类型中,则可能希望将其包含在该类型的哈希码中(假设一个典型的“multiply by primes”哈希函数)。如果只是调用SomeEnum.GetHashCode(),那么 JIT 似乎将实例装箱,即使在发布版本中也是如此。
对此进行分析表明,我的应用程序约有 10% 的时间用于在各种 GetHashCode 函数中进行装箱枚举。
多个值类型实现IEquatable或类似接口,允许以静态方法调用GetHashCode;这避免了拳击。但是System.Enum 不提供GetHashCode 的静态重载。是否有一些方法可以计算应该使用但避免装箱的代码?
【问题讨论】:
-
何必呢?枚举是它自己的哈希码。只需转换为 int 并收工。
-
@Raymond:我认为这可能会导致分布不佳;但再考虑一下,我会看看它是否有效。
-
@Raymond:这确实适用于这个特定的测试用例。不过我要暂时打开这个......
-
假设枚举的成员少于 40 亿,转换为 int 是一个完美的哈希(没有冲突)。
-
@RaymondChen 不一定。例如,考虑
enum E : long { V1 = 1, V2 = 0x100000001L }