我正在寻找建立更好的哈希值的建议,以减少预期容纳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个属性的结构创建哈希值的方法是否正确。任何建议都将不胜感激,感谢您的阅读。
只是想澄清一下,这个哈希值是针对存储在数组中的顶点,而不是数组本身。抱歉有任何困惑。