我已经知道要摆脱Swift中的字符串连接,所以理想情况下我正在考虑对2个变量进行异或,并将其中一个变换为解决可互换问题.
这有什么不对吗?
struct Person { let name: String let surname: String var hashValue: Int { return surname.hashValue << 1 ^ name.hashValue }}解决方法 Martin R在 here的旧Code Code帖子中慷慨地提供了Boost hash_combine函数的Swift翻译.
我们可以在你的struct中使用这个函数:
func hash_combine(seed: inout UInt,value: UInt) { let tmp = value &+ 0x9e3779b9 &+ (seed << 6) &+ (seed >> 2) seed ^= tmp}struct Person { let name: String let surname: String var hashValue: Int { var seed = UInt(0) hash_combine(seed: &seed,value: UInt(bitPattern: name.hashValue)) hash_combine(seed: &seed,value: UInt(bitPattern: surname.hashValue)) return Int(bitPattern: seed) }}Person(name: "Joe",surname: "Smith").hashValue // -5143836311621647467Person(name: "Smith",surname: "Joe").hashValue // -5146825509308597586
虽然不完美,但这应该可以减少大量样本集中的碰撞次数(请参阅CGPoint示例的链接帖子).
你可以在这里阅读更多关于“黄金比例”的信息:Magic number in boost::hash_combine
我还在测试这个,但我想这可以提供更少的碰撞,而不仅仅是换位1.
总结以上是内存溢出为你收集整理的Swift Hashing算法使用位移来避免冲突全部内容,希望文章能够帮你解决Swift Hashing算法使用位移来避免冲突所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)