加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift Hashing算法使用位移来避免冲突

发布时间:2020-12-14 04:32:03 所属栏目:百科 来源:网络整理
导读:给定一个具有名称和姓氏字符串属性的Person结构,我想编写一个有效的散列算法,避免可互换名称和姓氏的人员碰撞(例如Lara Ray和Ray Lara). 我已经知道要摆脱Swift中的字符串连接,所以理想情况下我正在考虑对2个变量进行异或,并将其中一个变换为解决可互换问题.
给定一个具有名称和姓氏字符串属性的Person结构,我想编写一个有效的散列算法,避免可互换名称和姓氏的人员碰撞(例如Lara Ray和Ray Lara).

我已经知道要摆脱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 // -5143836311621647467
Person(name: "Smith",surname: "Joe").hashValue // -5146825509308597586

虽然不完美,但这应该可以减少大量样本集中的碰撞次数(请参阅CGPoint示例的链接帖子).

你可以在这里阅读更多关于“黄金比例”的信息:Magic number in boost::hash_combine

我还在测试这个,但我想这可以提供更少的碰撞,而不仅仅是换位1.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读