是否可以从Any类型获取其UnsafeRawPointer和长度?

时间:2019-11-15 16:51:24

标签: swift unsafe-pointers

我只想调用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(...) }

有可能吗?又如何?

1 个答案:

答案 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到某种协议(没有语法要求),该协议表示“我已经检查过这种类型是可散列的。”