TFPCustomHashTable 构造函数使用 196613 常量。为什么使用这个特定值?
TFPCustomHashTable constructor use 196613 constant. Why use this particular value?
以下代码是 FreePascalcontnrs 单元的一部分
constructor TFPCustomHashTable.Create;
begin
CreateWith(196613,@RSHash);
end;
我很好奇196613
。我知道它是 hash table 大小。使用这个值有什么特别的原因吗?
在我的测试中,构造函数大约需要 3-4 毫秒才能执行,这在我的特定情况下是不可接受的。我怀疑这与这个常数值有关。
更新:
我的问题是:
- 为什么选择
196613
?为什么不是其他素数?
- 是否影响构造函数调用执行时间?
196613
是推荐用于散列 tables 大小(质数和远离 2 的幂)的数字之一,有关更多信息,请参见例如https://planetmath.org/goodhashtableprimes.
它影响构造函数调用执行时间,是的。您始终可以使用 CreateWith
构造 TFPCustomHashTable
并传递您选择的大小(任何数字都可以,因为调整大小算法会检查 suitable 大小)以及您自己的哈希函数(或预定义的 RSHash
):
MyHashTable:=TFPCustomHashTable.CreateWith(193,@RSHash);
不过请记住,调整散列大小 table 是一项昂贵的操作,因为它需要重新计算所有元素的散列函数,因此从太小的值开始既不是一个好主意。
以下代码是 FreePascalcontnrs 单元的一部分
constructor TFPCustomHashTable.Create;
begin
CreateWith(196613,@RSHash);
end;
我很好奇196613
。我知道它是 hash table 大小。使用这个值有什么特别的原因吗?
在我的测试中,构造函数大约需要 3-4 毫秒才能执行,这在我的特定情况下是不可接受的。我怀疑这与这个常数值有关。
更新:
我的问题是:
- 为什么选择
196613
?为什么不是其他素数? - 是否影响构造函数调用执行时间?
196613
是推荐用于散列 tables 大小(质数和远离 2 的幂)的数字之一,有关更多信息,请参见例如https://planetmath.org/goodhashtableprimes.
它影响构造函数调用执行时间,是的。您始终可以使用 CreateWith
构造 TFPCustomHashTable
并传递您选择的大小(任何数字都可以,因为调整大小算法会检查 suitable 大小)以及您自己的哈希函数(或预定义的 RSHash
):
MyHashTable:=TFPCustomHashTable.CreateWith(193,@RSHash);
不过请记住,调整散列大小 table 是一项昂贵的操作,因为它需要重新计算所有元素的散列函数,因此从太小的值开始既不是一个好主意。