问题标签 [hash-code-uniqueness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
725 浏览

scrapy - 如何处理scrapy图像下载中的图像文件名重复

Scrapy 使用 sha1 生成随机图像文件名。发生重复时,它将覆盖文件,导致现有图像文件丢失。是否可以编写额外的代码(例如:覆盖类)来处理重复。例如:不断生成新的随机文件名,直到找不到重复?如果是,请提供代码示例?

--- 老问题:是否检查以确保 images_store 文件夹下所有图像文件的文件名唯一性?Scrapy 在下载图像时使用 sha1 生成随机文件名。Sha1 提供了良好的唯一性,但从概率上讲,存在重复的机会。

0 投票
1 回答
881 浏览

java - 在java中实现好的hashCode函数?

我现在知道有一天内置实用程序可用,例如 Apache commons lang 的 HashCodeBuilder,但我试图了解如何自己实现它,并在http://en.wikipedia.org/wiki/Java_hashCode遇到了 Employee 类的 hascode 函数示例()

在谷歌的任何地方,都建议使用相同的技术,例如将非零值与奇数素数相乘,然后将其与实例变量相加(对实例变量执行此操作)。

问题:-

1)为什么我们不能将employeeId作为hascode返回,因为它会是独一无二的。它简单并且服务于hascode目的。同意,如果它不是唯一的,我们可能需要这种技术。那正确吗?

2)即使员工ID不是唯一的,为什么建议乘以奇数素数?为什么取任何该死的整数都不被认为是好的?

更新:-

彼得我运行了你提到它打印的例子

[0、32、64、96、128、160、192、224、288、256、352、320、384]

[0、32、64、96、128、160、192、224、288、256、352、320、384]

我假设现在的输出正如你所期望的那样理解你在回答中提到的概念

[373、343、305、275、239、205、171、137、102、68、34、0]

[0、34、68、102、137、171、205、239、275、305、343、373]

正如您在评论中所建议的那样,此示例表明即使是唯一的哈希码也可以最终出现在同一个存储桶中。这个例子是如何证明这种行为的?你的意思是整数 373 和整数 0 最终在同一个桶中吗?

在这个例子中质数有什么帮助,而 34 又如何没有帮助?

0 投票
2 回答
3440 浏览

c# - .Net C# String.GetHashCode() 替代方案

我在比较大量字符串数据(csv 文件)时遇到问题。这些文件具有 uniqueID 但未排序且它们很大。

所以我尝试创建两个字典,其中键是文件中的 uniqueID,值是 int,它返回我感兴趣的字符串的 GetHashCode() 以进行更改。

但是,简短的例子:

那么有没有其他方法可以做到这一点。

我需要尽可能少的占用空间(由于两个 csv 文件的两个字典的内存分配,其中包含大约 3M 行)谢谢

0 投票
1 回答
351 浏览

hash - 哪些哈希函数相互正交?

我对多级数据完整性检查和更正感兴趣。使用多个纠错码的地方(它们可以是 2 个相同类型的代码)。我的印象是,如果使用的 2 个哈希码彼此正交,则使用 2 个代码的系统将实现最大效率。

是否有哪些代码与哪些代码正交的列表?或者您是否需要使用相同的散列函数但具有不同的参数或用法?

我希望第一级 ecc 将是一个 reed-solomon 代码,尽管我实际上无法控制第一个函数,因此我不能使用具有改进功能的单个代码。

请注意,我不关心加密安全性。

编辑:这不是

0 投票
3 回答
2138 浏览

java - 生成具有唯一整数的哈希码

简单的问题。我有一个对象:

根据int id(它是一个数据库 id)确定谁的相等性。

Netbeans 自动生成了这个hashCode()方法:

问题是:与仅返回(已经) unique 相比,这有什么优势int id吗?

无论哪种方式,碰撞都是不可能的。

正确的?

0 投票
5 回答
1029 浏览

java - 如何确保 hashcode() 在 Java 中不会解析为相同的值?

我有一个类的哈希码实现,哈希码实现与 eclipse 生成的内容一致,也是此处讨论的最普遍接受的做法

这是我的哈希码实现(此方法中使用的所有 Id 构成对象的键):

我遇到了一个场景,我正在使用一个非常大的数据集进行测试,而我的集合没有这个类的预期数量的对象。仔细观察,下面的两个数据集产生了相同的哈希码:50268236873,因此一条记录被添加到集合中的最后一条替换,因为它们的哈希码相同。

所以,问题:

1]这是两个不同对象的哈希码具有相同值的明显情况。那么如何确保任何数据集都不会发生这种情况呢?质数应该更大吗?

2] 如果我们仔细观察,实现中的 hashCode 变量是 int 数据类型,其最大值为 2^31 - 1 = 2147483647,大于为上述数据集计算的 hashcode = 50268236873,因此存在溢出. 使用 long 作为 hashCode 值的类型有什么后果吗?

感谢
Nohsib

编辑 :

我正在使用 HashSet 并在阅读完发布的答案后,我查看了 equals 实现,如下所示,我认为因为在 equals 中我检查两个对象的 hashCodes 是否相同并使用它来确定它们是否是相同的对象导致了这个问题。

你们中的任何人都可以证实这一点吗?

解决方案:我的 equals 方法实现是错误的,因为我使用 hashCode 来确定两个对象是否相等。纠正 equals 方法实现解决了我的问题是 hashset 正在替换现有记录。

0 投票
1 回答
5639 浏览

hash - CRC-32 哈希的唯一性是否足以唯一标识包含文件名的字符串?

我已经对连接到字符串的文件名列表进行了排序,并希望通过唯一的校验和来识别每个这样的字符串。

这些字符串的大小最小为 100 字节,最大为 4000 字节,平均为 1000 字节。字符串的总数可以是任何东西,但更有可能在 ca 的范围内。10000。

CRC-32 是否适合此目的?

例如,我需要以下每个字符串具有不同的固定长度(最好是短)校验和:

CRC-32 哈希的唯一性是否会随着输入长度的增加而增加?

为此目的是否有更好的校验和选择?

0 投票
0 回答
1136 浏览

hash - MurmurHash3的逆

我正在寻找一个MurmurHash3_x64_128的反函数,在这个 Java 版本中实现。请注意,不同之处在于初始化h1h2通过一些幻数对种子进行异或运算。此外,实际上我只对 33 - 64 位感兴趣(因为我试图找出32 -> 32 bits 的简化版本的逆。

我发现了不错的博文,遗憾的是,它使用了算法的不同变体。

根据 wiki,该算法在密码学上不是安全的,因此应该存在逆算法。

0 投票
2 回答
150 浏览

c# - C# GetHashCode 实现

真的一样

关于唯一性?

Word是类型String

编辑:我忘了说,在程序中哪个更好,选项 1 或 2?

0 投票
2 回答
534 浏览

java - Java哈希码在一种情况下会发生冲突,而对于相同的对象则不会,为什么?(代码如下)

我尝试编写一个小程序来演示java中只有equals而不是hashcode()方法时的哈希冲突。这是为了证明两个不相等的对象可以具有相同的哈希码的理论。这是针对询问行为的面试问题。

我创建了 200,000 个对象,将它们存储在一个数组中,然后比较它们以查看哪些是重复的。(为此,我在对象创建阶段之后使用嵌套的 for 循环迭代对象数组。)对于大约 200,000 个对象,我得到 9 次碰撞。第一个是索引 196 和 121949 处的对象。然后我继续打印这些哈希码以显示两个值相同。

但是,我得到了一些非常令人惊讶的行为。如果我遍历嵌套的 for 循环并打印哈希码的第一次冲突,我会得到相同的哈希码值

对于索引 196 和 121949 处的对象。

但是,如果我注释掉用于检测所有冲突的嵌套 for 循环并直接打印索引 196 和 121949 处元素的哈希码,我会得到

请注意,我没有评论这些元素的创建,只是我检查碰撞的部分。

为什么会发生这种情况,即使我不迭代它们,哈希码不应该是一致的吗?

附录1:据我所知,这背后是否有来源,按照生日原则,如果我创建200,000个对象,我必须发生冲突,如何迭代每个hascode或不改变任何东西?

附录 2:我尝试添加另一个 200000 大小的数组只是为了查看碰撞索引是否发生变化,但它们没有发生变化,因此显然在未提交循环的情况下对二进制文件进行更改不会做出任何更改。所以改变二进制改变哈希​​码的假设不成立。

这是我的代码

评论输出:

未注释的循环输出