标签: hash-code-uniqueness

在java中传递对象时会发生什么?

我知道当我们传递对象时,我们将其引用作为值传递.但是你得到的这个值是hashcode()正确使用方法(根据我的测试,它是相同的)?既然hashcode()不是内存地址而且不能保证始终获得唯一值,那么在传递对象时是否会发生像碰撞这样的奇怪事情?

(假设hashcode()没有被覆盖,即它返回相同的值System.identityHashCode())

有三个人很喜欢这个问题,但我找不到一个相关的资源来讨论传递的价值是什么以及你如何得到它?

编辑: 这是我的测试.默认值toSting()使用hashCode()inside并将其转换为十六进制值.所以当我们传递对象时,这是传递的值吗?或者java做什么来跟踪所有对象(被传递),这样就不会有任何引用冲突

Object o = new Object();
System.out.println(o);
System.out.println(o.toString()); //both prints same thing - java.lang.Object@10385c1
Run Code Online (Sandbox Code Playgroud)

java hash-code-uniqueness object hashcode

5
推荐指数
1
解决办法
229
查看次数

哈希结果是否与源值相同?

这更像是一个加密理论问题,但是哈希算法的结果是否可能与源相同?例如,假设我有一个字符串:

baf34551fecb48acc3da868eb85e1b6dac9de356
Run Code Online (Sandbox Code Playgroud)

如果我得到SHA1哈希,结果是:

4d2f72adbafddfe49a726990a1bcb8d34d3da162
Run Code Online (Sandbox Code Playgroud)

理论上,是否存在这两个值匹配的情况?我不是在这里特别询问SHA1 - 这只是我的例子.我只是想知道是否以这种方式构建散列算法.

hash cryptography hash-code-uniqueness hash-collision

4
推荐指数
1
解决办法
668
查看次数

复杂对象图的快速HashCode

我有一个非常复杂的对象,我需要获得这些对象的唯一性.一种解决方案可以通过覆盖来完成GetHashCode().我已经实现了以下代码:

public override int GetHashCode()
{
    return this._complexObject1.GetHashCode() ^
           this._complexObject2.GetHashCode() ^
           this._complexObject3.GetHashCode() ^
           this._complexObject4.GetHashCode() ^
           this._complexObject5.GetHashCode() ^
           this._complexObject6.GetHashCode() ^
           this._complexObject7.GetHashCode() ^
           this._complexObject8.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

这些复杂对象也会覆盖 GetHashCode()并执行类似的操作.

我的项目需要这些对象的唯一性,我经常处理这些对象,并且内部数据也会以各种方式和位置发生变化.

我需要一种更快的方法来找到这些复杂对象的唯一性,这需要考虑性能内存.

在此先感谢
Munim

.net c# performance hash-code-uniqueness

4
推荐指数
1
解决办法
2174
查看次数

我可以假设具有相同System.identityHashCode的两个对象是相同的吗?

虽然两个不同的对象可能具有相同的哈希码,但是,System.identityHashCode()似乎返回对象的内存指针.我想在32位JVM实现中没有例外,包括Sun JDK,Open JDK.但是,我没有检查源代码.在实践中,我可以假设两个具有相同的对象System.identityHashCode()是相同的吗?

java hash-code-uniqueness

4
推荐指数
2
解决办法
1123
查看次数

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

我已经将连接到字符串的文件名列表排序,并希望通过唯一的校验和来标识每个这样的字符串.

这些字符串的大小至少为100个字节,最多为4000个字节,平均为1000个字节.字符串的总数可以是任何值,但更可能是在ca.的范围内.10000.

CRC-32适用于此目的吗?

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

"/some/path/to/something/some/other/path"
"/some/path/to/something/another/path"
"/some/path"
...
# these strings can get __very__ long (very long strings are the norm)
Run Code Online (Sandbox Code Playgroud)

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

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

hash crc32 hash-code-uniqueness

4
推荐指数
1
解决办法
3235
查看次数

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

比较很多字符串数据(csv文件)时遇到问题.这些文件具有唯一ID但未排序且非常大.

所以我尝试创建两个字典,其中key是来自file的uniqueID,而Value是int,它返回我感兴趣的字符串的GetHashCode()以进行更改.

但是,简短的例子:

if ("30000100153:135933:Wuchterlova:335:2:Praha:16000".GetHashCode() == 
    "30000263338:158364:Radošovická:1323:10:Praha:10000".GetHashCode())
{
    Console.WriteLine("Hmm that's strange");
}
Run Code Online (Sandbox Code Playgroud)

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

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

.net c# hash-code-uniqueness

3
推荐指数
1
解决办法
2948
查看次数

为什么此函数生成的哈希码不是唯一的?

我正在测试我从谷歌搜索获得的VB函数.我打算用它来生成哈希码以进行快速字符串比较.但是,有时两个不同的字符串具有相同的哈希码.例如,这些字符串

"122Gen 1堆大小(.NET CLR内存w3wp):mccsmtpteweb025.20833333333333E-02"

"122Gen 2堆大小(.NET CLR内存w3wp):mccsmtpteweb015.20833333333333E-02"

具有相同的哈希码237117279.

请告诉我: - 这个功能有什么问题? - 我该如何解决?

谢谢

马丁


Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal bytes As Long)

Private Function HashCode(Key As String) As Long
  On Error GoTo ErrorGoTo

  Dim lastEl As Long, i As Long
  ' copy ansi codes into an array of long'
  lastEl = (Len(Key) - 1) \ 4
  ReDim codes(lastEl) As Long
  ' this also converts from Unicode to ANSI'
  CopyMemory …
Run Code Online (Sandbox Code Playgroud)

vb6 hash-function hash-code-uniqueness

1
推荐指数
2
解决办法
3690
查看次数

使用HashMap支持的contains()方法的Set的准确性?

嗨我正在使用一个由HashMap支持的Set来跟踪我已经在图表中遍历的边缘.我计划通过添加存储在每个边缘的数据的哈希码的结果来键入该集合.

v.getData().hashCode() + wordV.getData().hashCode()
Run Code Online (Sandbox Code Playgroud)

但是当使用contains来检查边缘是否在集合中时,这有多可靠?我不能假设得到误报吗?无论如何要克服这个?

引起我关注的确切陈述是:

edgeSet.contains(v.getData().hashCode() + wordV.getData().hashCode())
Run Code Online (Sandbox Code Playgroud)

谢谢!

哦顺便说一句,我正在使用Java.

编辑:

我应该在这个问题上明确这一点.在我的图形中没有边缘对象,有顶点对象,每个顶点对象包含更多顶点对象的列表,即边缘.因此,我认为结合您的回答后面的问题是:

我可以使用Set来存储信息的引用而不是对象....?即我可以存储为顶点的数据对象添加两个哈希码的结果吗?

EDIT2:

我确实使用Java库作为我的hashmap,我将其声明如下:

Set<Integer> edgeSet = Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());
Run Code Online (Sandbox Code Playgroud)

java hash-code-uniqueness hashmap set hashcode

1
推荐指数
2
解决办法
317
查看次数

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

我有一个类的哈希码实现,哈希码实现与eclipse生成的一致,也是这里讨论的最常被接受的实践

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

public int hashCode() {
    final int prime = 31;
    int hashCode = 1;
    if(uId != null){
        hashCode = prime * hashCode + uId.hashCode();
    }
    if(rId != null){
        hashCode = prime * hashCode + rId.hashCode();
    }
    if(bId != null){
        hashCode = prime * hashCode + bId.hashCode();
    }
    if(reId != null){
        hashCode = prime * hashCode + reId.hashCode();
    }
    if(cId != null){
        hashCode = prime * hashCode + cId.hashCode();
    }
    return hashCode;
}
Run Code Online (Sandbox Code Playgroud)

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

  Existing record :
  Record@2c0781cd[uId=54046,rId=10967,bId=177,reId=1728,cId=50194] …
Run Code Online (Sandbox Code Playgroud)

java hash-code-uniqueness hashcode java-ee java-ee-7

0
推荐指数
1
解决办法
535
查看次数