【问题标题】:Int array as a key in a Dictionary VS a stringInt 数组作为字典中的键 VS 字符串
【发布时间】:2017-07-19 16:31:26
【问题描述】:

我现在有一本字典,它使用string 作为键,GameObject 作为值。

字符串都是IP地址,所以不是很长。这是一个例子:

string ip = "192.68.137.1"

我知道数字比较比字符串快得多,而且我能够在我的数据库服务器中解析 IP 地址。

使用整数数组作为字典的 KEY 会更快吗?像这样:

int[] ip = { 192, 168, 137, 1 }

我正在定期检查字典是否包含某些值,并定期添加到字典中(通常至少每秒一次)。

我对此感到困惑的原因是因为我使用的字符串(IP 地址)总是在那个长度左右,那么使用整数数组会有什么真正的好处吗?如果字典每次都必须遍历 4 个数字,我不知道这比字符串比较快多少。

【问题讨论】:

  • 更好的是,您可以简单地使用 int 作为键。 IP 基本上是一个 4 字节的列表(几乎是一个 int)。例如,“192.68.137.1”等价于 0xc0a88901。
  • IP 地址适合一个 Int32 :)
  • 如何将这些字符串或数组转换为一个 int?
  • 吹毛求疵:int[] ip = [192,168, 137,1] 不是有效的 c#。应该是int[] ip = {192,168, 137,1}(即大括号)
  • 因为这是每秒完成一次,所以应该没有问题。

标签: c# string dictionary unity3d int


【解决方案1】:

与以往一样,您应该测试性能,而不是猜测或要求他人猜测。但是,需要考虑两件事:

  • 您显示了一个 IPv4 地址……那么 IPv6 呢?这肯定会使事情复杂化
  • IPv4 地址实际上是 4 个字节...那么为什么不将其转换为单个 uintIPAddress 作为密钥呢?这样您就不需要编写自己的EqualityComparer<int[]>。很遗憾 IPAddress 没有实现 IEquatable<IPAddress>,但看起来它确实适当地覆盖了 Equals/GetHashCode

我会考虑第一点,编写详细的基准来确定这到底有多重要 - 如果您真的每秒只查看一次,那么它不太可能在全部 - 然后尝试各种选项。如果您可以展示经过验证的显着改进,我只会放弃最简单的代码(如果您已经通过这种方式接收 IP 地址,这将是一个字符串)。

【讨论】:

  • 我的第一个问题也是“不同格式的 IPv6 怎么样?”
  • 非常感谢,这个link对我也很有帮助。
【解决方案2】:

我可能会使用 IPAddress 作为密钥。我假设(尽管您可以测试)这将是对其哈希的有效搜索,并且整个 v4/v6 内容将由数据类型为您处理。

【讨论】:

    【解决方案3】:

    您可以使用 IPAdress 类作为字典中的键。 从字符串创建示例:
    var ipAddressString = "192.68.137.1" IPAddress address = IPAddress.Parse(ipAddressString)
    这是更正确的方法。
    来源:https://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2014-02-07
      • 1970-01-01
      • 2013-06-11
      • 2010-11-29
      • 2016-01-14
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多