Swift:有没有比 "\(array)"更快的方法来哈希整数数组

标签 swift string performance

我想实现一个字典,其中键的类型为String

String 键是通过按字面连接 Int 数组生成的(它基本上是一个地址)。

即地址 [0, 10, 32] 的哈希值为“01032”。

这些值永远不会超过 255——事实上我可以使用 [UInt8]

我在 XCode 中做了一些测试,并获得了不错的性能。 0.036 秒:

func testPerformance() {
    let address = [10, 176, 12] //should become "1017612"
    self.measure {
         for _ in 0..<10_000 {
             let key = "\(address[0])\(address[1])\(address[2])"
         }
    }
}

我的问题:是否有一种更轻量级的 String 类型或方法可以比这更快地完成我想要的事情?据我了解,Swift 的 String 类相当重量级,下面添加了各种字符信息:

https://medium.com/@tonyallevato/strings-characters-and-performance-in-swift-a-deep-dive-b7b5bde58d53

最佳答案

我不明白为什么你首先要花费所有的开销来制作一个字符串。你有小的 Int,所以为什么不计算一个唯一的 Int 作为键:

let address = [10, 176, 12]
let key = address[0] * 255 * 255 + address[1] * 255 + address[2]

这是非常快速和自散列的,并且可以通过规则轻松提取原始组件。

或者,您可以使用三个 Int 属性的自定义结构,在该结构上您已经实现了 Hashable(按照相同的规则)和 Equatable(按照明显的规则)。

关于Swift:有没有比 "\(array)"更快的方法来哈希整数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45579823/

相关文章:

Swift UISwitch 选择器内联

c# - 输入字符串的格式不正确

java - 将String(表示十进制数)转换为long

java - 将变量声明为最终的内部方法会提高性能吗?

sql统计io扫描计数说明

ios - 泛型函数和 Any 的使用之间的区别

ios - 禁用特定选项卡栏项目排序的最佳方法

ios - 使用手势识别器添加 subview 时遇到 UI 故障问题

C++ 将 vector<string> 元素传递给函数导致 SIGSEGV 崩溃

linux - “dotted” linestyle 的性能比 “dashed” linestyle 慢很多是正常的吗?