Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字典中的长字符串键是否会导致性能问题?_C#_Performance - Fatal编程技术网

C# 字典中的长字符串键是否会导致性能问题?

C# 字典中的长字符串键是否会导致性能问题?,c#,performance,C#,Performance,我考虑使用字典通过字符串键查找值。据我所知,键越长,在字典中查找所需的时间就越长。我的钥匙可能很长,比如/page-1/page-2/page-3/page-4。。。等等,每个名字都可以很长 在字典中使用长字符串键时,我能期望得到什么性能影响?是什么机制导致这些开销?每次访问该字典中的密钥时,必须对传入的输入进行哈希处理。NET不缓存字符串哈希代码。哈希是输入字符串长度中的一种线性操作。长度的10倍大约是散列成本的10倍 平等比较也是如此。当字典发现两个哈希代码相等时(每次成功查找和每次键冲突都

我考虑使用
字典
通过字符串键查找值。据我所知,键越长,在字典中查找所需的时间就越长。我的钥匙可能很长,比如
/page-1/page-2/page-3/page-4
。。。等等,每个名字都可以很长


在字典中使用长字符串键时,我能期望得到什么性能影响?是什么机制导致这些开销?

每次访问该字典中的密钥时,必须对传入的输入进行哈希处理。NET不缓存字符串哈希代码。哈希是输入字符串长度中的一种线性操作。长度的10倍大约是散列成本的10倍

平等比较也是如此。当字典发现两个哈希代码相等时(每次成功查找和每次键冲突都会发生这种情况),它必须比较字符串。这又是一个线性运算,但速度非常快

这些几乎是长钥匙造成的唯一成本


对于您的用例,我无法告诉您这是否足够快。你得测量一下。答案取决于键长度和访问字典的频率。

这是如何计算字符串的哈希代码

public override unsafe int GetHashCode()
{
  if (HashHelpers.s_UseRandomizedStringHashing)
    return string.InternalMarvin32HashString(this, this.Length, 0L);
  fixed (char* chPtr = this)
  {
    int num1 = 352654597;
    int num2 = num1;
    int* numPtr = (int*) chPtr;
    int length = this.Length;
    while (length > 2)
    {
      num1 = (num1 << 5) + num1 + (num1 >> 27) ^ *numPtr;
      num2 = (num2 << 5) + num2 + (num2 >> 27) ^ numPtr[1];
      numPtr += 2;
      length -= 4;
    }
    if (length > 0)
      num1 = (num1 << 5) + num1 + (num1 >> 27) ^ *numPtr;
    return num1 + num2 * 1566083941;
  }
}
public覆盖不安全的int-GetHashCode()
{
if(HashHelpers.s_UseRandomizedStringHashing)
返回字符串.InternalMarvin32HashString(this,this.Length,0L);
固定(char*chPtr=this)
{
int num1=352654597;
int num2=num1;
int*numPtr=(int*)chPtr;
int length=这个.length;
而(长度>2)
{
num1=(num1>27)^*numPtr;
num2=(num2>27)^numPtr[1];
numpr+=2;
长度-=4;
}
如果(长度>0)
num1=(num1>27)^*numPtr;
返回num1+num2*1566083941;
}
}

正如我们所看到的,哈希代码的计算成本直接取决于字符串的长度。

坦率地说:测量它;我不会太在意url长度/字典性能。计算很简单:如果实际花费的时间<你认为可以接受的最大持续时间,那么一切都是最甜蜜的,否则很快就会得到优化。