- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 int16_t
创建一个哈希函数。函数原型(prototype)如下所示:
uint64_t hash_int16_t(const void *key);
到目前为止,我已经得到了这个,但我不知道这是否是正确的方法:
uint64_t hash_int16_t(const void *key)
{
// key is expected to be an int16_t
const int16_t *e = (const int16_t*)key;
uint64_t x = (uint64_t)*e;
x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9);
x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb);
x = x ^ (x >> 31);
return x;
}
有符号类型的哈希函数吗?我应该使用 16 位无符号整数混合这些位还是 64 位无符号整数就可以了?如果整数为负数,当我将其转换为无符号类型时,我会丢失信息吗?这会产生未定义的行为吗?
附注代码是 C 语言,我从 here 中获取了哈希函数。 .
编辑 1:参数为 const void *key
因为允许用户将键存储为其他值(例如结构或字符串)。上述函数将添加对 int16_t
的支持键。
编辑2:我想要完成的是一个通用的哈希表。用户在初始化哈希表时必须提供哈希函数,上面的示例与哈希表捆绑在一起。
最佳答案
当然。适用于无符号类型的良好哈希函数也可以适用于有符号类型。如果哈希函数好,那么它就有好 uniformity ,因此将特定位称为“符号位”或“只是另一位”并不重要。出于本答案的目的,我将认为您在链接线程中找到的算法是“好的”。Is there a hash function for signed types?
Should I mix the bits using 16 bit unsigned integers or 64 bit unsigned integers will do fine?
您不能依赖位移运算符来提升将 uint16_t
移位到 uint64_t
的结果,因此您必须使用 uint64_t
code> 如您发布的代码所示。
Will I be loosing information when I cast it to an unsigned type if the integer is negative?
否,因为 int16_t
的每个可能值在转换为 uint64_t
时都会映射到不同的值:范围 [0, 32767] 映射到 [0, 32767 ] 和范围 [-32768, -1] 映射到 [18446744073709518848, 18446744073709551615] (请参阅下面的说明)。
Will this generate undefined behavior?
没有。 C 标准 (C11) 指定以下有符号到无符号整数转换(第 6.3.1.3 节):
[...] if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.
因此,-32768 转换为 -32768 + 264 = 18446744073709518848,-1 转换为 -1 + 264 = 18446744073709551615。
<小时/>至于算法本身...如果哈希值仅用于创建哈希表,则哈希函数不需要具有任何加密属性,例如分散性。因此,这个简单的算法可能适用于 int16_t x
:
return (uint64_t) x;
该函数没有色散,但输入和输出范围具有(简单的)最佳均匀性。这是否可以接受取决于哈希表的实现。如果它天真地仅使用哈希值的某些位来选择一个容器来放置该值,并且它自己不进行任何混合,那么您需要将输出的一致性集中在这些位上,无论在哪里/无论它们是什么。
关于c - 将 int16_t 哈希为 uint64_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53748067/
我正在尝试 grep conf 文件中所有不以 开头的有效行 哈希(或) 任意数量的空格(0 个或多个)和一个散列 下面的正则表达式似乎不起作用。 grep ^[^[[:blank:]]*#] /op
我正在使用哈希通过 URL 发送 protected 电子邮件以激活帐户 Hash::make($data["email"]); 但是哈希结果是 %242y%2410%24xaiB/eO6knk8sL
我是 Perl 的新手,正在尝试从文本文件创建散列。我有一个代码外部的文本文件,旨在供其他人编辑。前提是他们应该熟悉 Perl 并且知道在哪里编辑。文本文件本质上包含几个散列的散列,具有正确的语法、缩
我一直在阅读 perl 文档,但我不太了解哈希。我正在尝试查找哈希键是否存在,如果存在,则比较其值。让我感到困惑的是,我的搜索结果表明您可以通过 if (exists $files{$key}) 找到
我遇到了数字对映射到其他数字对的问题。例如,(1,2)->(12,97)。有些对可能映射到多个其他对,所以我真正需要的是将一对映射到列表列表的能力,例如 (1,2)->((12,97),(4,1))。
我见过的所有 Mustache 文档和示例都展示了如何使用散列来填充模板。我有兴趣去另一个方向。 EG,如果我有这个: Hello {{name}} mustache 能否生成这个(伪代码): tag
我正在尝试使用此公式创建密码摘要以获取以下变量,但我的代码不匹配。不确定我做错了什么,但当我需要帮助时我会承认。希望有人在那里可以提供帮助。 文档中的公式:Base64(SHA1(NONCE + TI
我希望遍历我传递给定路径的这些数据结构(基本上是目录结构)。 目标是列出根/基本路径,然后列出所有子 path s 如果它们存在并且对于每个子 path存在,列出 file从那个子路径。 我知道这可能
我希望有一个包含对子函数的引用的散列,我可以在其中根据用户定义的变量调用这些函数,我将尝试给出我正在尝试做的事情的简化示例。 my %colors = ( vim => setup_vim()
我注意到,在使用 vim 将它们复制粘贴到文件中后尝试生成一些散列时,散列不是它应该的样子。打开和写出文件时相同。与 nano 的行为相同,所以一定有我遗漏的地方。 $ echo -n "foo"
数组和散列作为状态变量存在限制。从 Perl 5.10 开始,我们无法在列表上下文中初始化它们: 所以 state @array = qw(a b c); #Error! 为什么会这样?为什么这是不允
在端口 80 上使用 varnish 5.1 的多网站设置中,我不想缓存所有域。 这在 vcl_recv 中很容易完成。 if ( req.http.Host == "cache.this.domai
基本上,缓存破坏文件上的哈希不会更新。 class S3PipelineStorage(PipelineMixin, CachedFilesMixin, S3BotoStorage): pa
eclipse dart插件在“变量” View 中显示如下内容: 在“值”列中可见的“id”是什么意思? “id”是唯一的吗?在调试期间,如何确定两个实例是否相同?我是否需要在所有类中重写toStr
如何将Powershell中的命令行参数读入数组?就像是 myprogram -file file1 -file file2 -file file3 然后我有一个数组 [file1,file2,fil
我正尝试在 coldfusion 中为我们的安全支付网关创建哈希密码以接受交易。 很遗憾,支付网关拒绝接受我生成的哈希值。 表单发送交易的所有元素,并发送基于五个不同字段生成的哈希值。 在 PHP 中
例如,我有一个包含 5 个元素的哈希: my_hash = {a: 'qwe', b: 'zcx', c: 'dss', d: 'ccc', e: 'www' } 我的目标是每次循环哈希时都返回,但没
我在这里看到了令人作呕的类似问题,但没有一个能具体回答我自己的问题。 我正在尝试以编程方式创建哈希的哈希。我的问题代码如下: my %this_hash = (); if ($user_hash{$u
我正尝试在 coldfusion 中为我们的安全支付网关创建哈希密码以接受交易。 很遗憾,支付网关拒绝接受我生成的哈希值。 表单发送交易的所有元素,并发送基于五个不同字段生成的哈希值。 在 PHP 中
这个问题已经有答案了: Java - how to convert letters in a string to a number? (9 个回答) 已关闭 7 年前。 我需要一种简短的方法将字符串转
我是一名优秀的程序员,十分优秀!