我只想调用C函数
static inline uint64_t wyhash(const void* key, uint64_t len, uint64_t seed)
从Swift这样
func hash<T: Any>(key: T, seed: UInt64) -> UInt64 { wyhash(...) }
有可能吗?又如何?
答案 0 :(得分:1)
要计算大小,请使用MemoryLayout
:
func hash<T>(key: T, seed: UInt64) -> UInt64 {
let len = UInt64(MemoryLayout.size(ofValue: key))
return withUnsafePointer(to: key) { myhash($0, len, seed) }
}
请记住,结构类型可能具有内部填充,而且我不认为Swift会承诺对其进行初始化。因此,如果您不注意在此处传递的内容,则可能会结束对随机值的哈希处理。当然,类型可能具有非显而易见的内部状态,这可能导致“相等”值以不同的方式散列,反之亦然。考虑到可能难以诊断的错误,我通常建议为您知道该功能可接受的类型编写特定的重载,而不是尝试对Any进行哈希处理。至少,我会约束T
到某种协议(没有语法要求),该协议表示“我已经检查过这种类型是可散列的。”