【发布时间】:2021-01-11 02:10:31
【问题描述】:
我正在编写一个哈希表实现,它可以接受任意数据大小作为键和自定义哈希函数(返回 uint32_t)。
我有一个使用 16 字节 UUID 作为键的哈希表实例。由于 UUID 的分布已经非常广泛,我认为散列函数可以很简单
typedef unsigned char UUID[16];
static inline uint32_t uuid_hash_fn(const UUID uuid)
{ return *((uint32_t*)(uuid + 4)); } // skipping the 4 MSB that are constant in UUID
这有什么问题吗?
函数是否已经被优化,因为它只需要足够的最左边字节来填充 uint32?
编辑:根据评论者的建议,我想澄清一下“这有什么问题吗”我的意思是:这种方法是否有可能出现意外行为?
【问题讨论】:
-
这段代码有问题还是您只是在寻找“最佳实施”建议?
-
“最好最快”的实施建议。
-
@Abion47 如果尚未实施,则不会。
-
@MarkRansom 代码可能包含客观错误,但这不是问题所在。如果问题被改写为询问代码中是否存在错误或未定义的行为,而不是询问这是否已“优化”或此散列函数的“最佳实现”是什么,那么它将成为这里的主题。
-
@user3758232 如果基地址对齐,则 4 字节跳转与
uint32_t对齐。鉴于uuid只需要char对齐,不确定uuid+4是否与uint32_t对齐。覆盖union和其他对齐代码可能会解决这种极端情况。