是否可以从 Any 类型中获取他的 UnsafeRawPointer 和长度?
Is it possible to get from Any type his UnsafeRawPointer and length?
我只想调用 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(...) }
可能吗?又如何?
要计算大小,请使用 MemoryLayout
:
func hash<T>(key: T, seed: UInt64) -> UInt64 {
let len = UInt64(MemoryLayout.size(ofValue: key))
return withUnsafePointer(to: key) { myhash([=10=], len, seed) }
}
请记住,结构类型可能有内部填充,我不相信 Swift 承诺会进行初始化。因此,如果您不小心传递到此处的内容,您可能会散列随机值。当然,类型可能具有不明显的内部状态,可能导致 "equal" 值以不同方式散列,反之亦然。考虑到难以诊断错误的可能性,我通常会建议为您知道该函数可接受的类型编写特定的重载,而不是尝试对 Any 进行散列。至少,我会将 T
限制为某种表达 "I've checked that this type is myhash-able."
的协议(没有语法要求)
我只想调用 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(...) }
可能吗?又如何?
要计算大小,请使用 MemoryLayout
:
func hash<T>(key: T, seed: UInt64) -> UInt64 {
let len = UInt64(MemoryLayout.size(ofValue: key))
return withUnsafePointer(to: key) { myhash([=10=], len, seed) }
}
请记住,结构类型可能有内部填充,我不相信 Swift 承诺会进行初始化。因此,如果您不小心传递到此处的内容,您可能会散列随机值。当然,类型可能具有不明显的内部状态,可能导致 "equal" 值以不同方式散列,反之亦然。考虑到难以诊断错误的可能性,我通常会建议为您知道该函数可接受的类型编写特定的重载,而不是尝试对 Any 进行散列。至少,我会将 T
限制为某种表达 "I've checked that this type is myhash-able."