Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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_Integer_Hashtable_Hash_Hashcode - Fatal编程技术网

C 使用整数值作为哈希表的键有多愚蠢?

C 使用整数值作为哈希表的键有多愚蠢?,c,integer,hashtable,hash,hashcode,C,Integer,Hashtable,Hash,Hashcode,我需要使用具有不同键的哈希表。一个作为键的字符串,另一个作为整数 对于整数1,对数字运行哈希函数来生成密钥是多么愚蠢啊 我的意思是,我将用作哈希表键的数字总是不同的,不会有重复的。对我来说,使用mod运算符“截断”哈希表大小以下的值还不够吗 或者还有别的什么吗?这并不愚蠢,它是完全明智的。整数是唯一命名方案中的自然种子。尽管当我说这样的话时,我内心的关系狂热者会死一点,但我认为这并不愚蠢。如果您的值相对较少(在这种情况下,使用普通数组可能更好),那么它可能不是最佳选择 我会使用模运算符将整数散列

我需要使用具有不同键的哈希表。一个作为键的字符串,另一个作为整数

对于整数1,对数字运行哈希函数来生成密钥是多么愚蠢啊

我的意思是,我将用作哈希表键的数字总是不同的,不会有重复的。对我来说,使用mod运算符“截断”哈希表大小以下的值还不够吗


或者还有别的什么吗?

这并不愚蠢,它是完全明智的。整数是唯一命名方案中的自然种子。尽管当我说这样的话时,我内心的关系狂热者会死一点,但我认为这并不愚蠢。如果您的值相对较少(在这种情况下,使用普通数组可能更好),那么它可能不是最佳选择


我会使用模运算符将整数散列到散列大小。

如果是整数,如何使用排序数组并进行二进制搜索?实际上字符串也是一样,但是字符串哈希可能更便宜,除非整数键很有可能是62、93、124、。。。您的哈希表大小正好是31


看看你是否担心这一点。

就像我们领域中的许多设计问题一样,答案是:“视情况而定”。在某些特定情况下,对整数运行典型的哈希算法是愚蠢的。如果您知道基于您的具体情况,模数会均匀地分布预期数据,并且如果性能对您非常重要,并且如果您需要大量访问此哈希表,那么这将是愚蠢的。除非出现这些情况,否则有很多很好的理由可以使用通用哈希算法,该算法可以在各种情况下正常工作。在绝大多数情况下,否则做是愚蠢的。在某些情况下,首先使用哈希表是一个愚蠢的选择


如果您向我们提供了有关存储的数据类型、存储原因以及性能对您的重要性的更多信息,我们可能会为您提供一种比使用哈希表更好的解决方案。Java和.NET等框架具有快速的散列函数,可以避免将数字散列到同一个存储桶中。在大多数情况下,我相信默认的哈希方法。

什么平台。网?JAVAC++?也许我错了,但是如果数字是唯一的,为什么不使用数字本身作为关键字?@圭多:是的,java就是这样做的(不能为别的东西说话),这也是我问平台的原因之一。对不起,我忘了…C.@Guido,这就是我在问题本身上所说的……数组不是这个问题的通用答案,如果这些人在100附近有几个数字,然后有一个值,比如5000,会怎么样?这是一个很大的洞。@Hassan,在这种情况下,你可以使用sparce数组。@Hassan,他从未说过或暗示数组是这个问题的通用答案。一个答案在大多数情况下可能是正确的,但重要的是要认识到“正确”的答案取决于具体的条件。感谢您对条带化的解释——您对我的解释比Romain清楚得多——我现在将根据您的建议去medidate。二进制搜索是O(logn),哈希表访问是O(1)摊销的。是的,我知道log n>32的可能性很小……关键字是“摊销”。您需要考虑计划使用的哈希表的大小,然后计划存储的项目数和散列函数。我仍然更喜欢二进制搜索,因为它很简单,而且O(logn)的速度也很快。在我知道他是否希望添加/删除值以及希望添加/删除值的频率之前,我会犹豫是否建议使用排序数组,这将是一个O(n)函数。很抱歉,我没有回答您满意的问题。当人们在没有提供足够背景信息的情况下问一个非常普通的问题时,显而易见的简短答案在某些情况下往往并不正确。我试图指出这一点,同时暗示在大多数情况下,使用标准哈希算法并不愚蠢。我只是没有直截了当地表明我实际上是在回答你的问题。希望我的新的开头段落能在一定程度上澄清我的答案。