减少顶点阵列的哈希碰撞

时间:2016-11-22 21:13:36

标签: arrays swift struct

我正在寻找建立更好的哈希值的建议,以减少预期容纳100,000个顶点的数组的冲突。

hash属性是用于保存顶点数据的结构的一部分,每个顶点将保存8个浮点值。浮点值可以为负数,并通过小数点延伸15个空格。

我做了两个计算的hashValue属性

第一版

第一个版本从Vertex结构的8个属性创建一个String,并返回该字符串的哈希值。

var hashValue: Int {
        return "\(self.x),\(self.y),\(self.z),\(self.nx),\(self.ny),\(self.nz),\(self.s),\(self.t),".hashValue
    }

第二版

第二个版本循环遍历Vertex结构中的所有属性。乘以将小数位移15个空格向右移动,然后在最终将值的类型从Float更改为Int并添加到散列总数之前使值成为绝对值。

var hashValue: Int {
        let array = [self.x, self.y, self.z, self.nx, self.ny, self.nz, self.s, self.t]

        var hash = 0
        for number in array {
            let absolute = abs(number * 1e15)
            let int = Int(absolute)
            hash += int
        }

        return hash
    }

两个版本最终都产生了类似的哈希冲突计数。我希望能进一步减少它。

我所看到的关于哈希值的所有示例都是带有两个属性的结构。

var hashValue: Int {
        return x.hashValue ^ y.hashValue
    }

我不确定我为具有8个属性的结构创建哈希值的方法是否正确。任何建议都将不胜感激,感谢您的阅读。

只是想澄清一下,这个哈希值是针对存储在数组中的顶点,而不是数组本身。抱歉有任何困惑。

0 个答案:

没有答案