- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我被分配做以下工作:
The easiest hashing function it to read the string a character by character and consider each character as an unsigned 8-bit number between 0 and 255. Then we add all the characters modulo some integer k resulting in an integer between 0 and k-1. We assume the previous hashing function. The hashing function adds the bytes of a string modulo k. The size of the hash table is k.
因此,我编码如下:
unsigned hash (char *s)
{
unsigned hashval;
for (hashval = 0; *s != '\0'; s++) {
hashval += *s;
}
return hashval % HASHSIZE;
}
这里,HASHSIZE相当于规范中的K。
但是我不确定我是否做对了,这真的是哈希函数吗?
非常感谢。
最佳答案
But I am not sure if I am doing correctly, Is this really hash function?
我认为您是在问您的代码是否准确地实现了您提供的规范。虽然很接近,但它不是,至少不是以便携的方式。主要问题是它未能解决规范的这一规定:
consider each character as an unsigned 8-bit number
C 允许
char
类型是签名还是未签名,由实现自行决定。签名char
这很常见,您的代码没有考虑到这一点。此外,虽然 C 需要
char
与unsigned char
大小相同,并且需要unsigned char
拥有至少 8 位,其中没有填充位,它不需要恰好 8 位。然而,实际上,所有现代系统都使用 8 位char
s,并且该练习似乎不太可能要求您考虑更大的可能性。要解决此问题,您需要转换每个
<小时/>char
在将字符串添加到累加器变量之前将其转换为无符号 8 位数字。有几种方法可以做到这一点。如果您愿意假设unsigned char
恰好有 8 位,那么最简单的方法就是在添加之前将每个字符转换为该类型。作为次要问题,您的函数不一定实现规范中描述的模块化加法:
The hashing function adds the bytes of a string modulo k.
这里的风险是字符串中所有字符的总和足以溢出类型
unsigned
。该类型的最大值可以小至 65535(尽管在大多数现代实现中它要大得多),并且在该大小下,输入字符串的字符总和可能会溢出。在这种情况下,等到最后计算余数将产生错误的结果,除非参数 K 是 2 的幂。另请注意,选择类型
unsigned int
因为结果将允许的 K 限制为最多UINT_MAX + 1
,并使用unsigned int
因为内部累加器变量与UINT_MAX - 254
之间的 K 值不一致和UINT_MAX
(但是UINT_MAX + 1
仍然可以)。为了(主要)解决此问题,在添加每个字符后计算并存储模数,而不是等到最后才这样做。
如果您需要安置 K 靠近但小于
UINT_MAX + 1
,那么您还需要注意加法溢出,并在发生溢出时进行更正。
关于c - 我对哈希函数做得正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41989009/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!