标签: hashcode

有没有办法用epsilon获取浮点数的哈希码?

众所周知,通过==比较浮点数通常是一个错误.在我写的3D矢量类(具有浮点分量X,Y,Z)中,如果它们的距离被认为是零,则认为两个矢量相等.

    public override bool Equals(object obj)
    {
        if (obj == null) {
            return false;
        }

        if (GetType () != obj.GetType ()) {
            return false;
        }

        float d = DistSq ((Vec) obj);

        return IsConsideredZero (d);
    }

    public float DistSq(Vec p)
    {
        Vec d = this - p;
        return d.LengthSq ();
    }

    public float LengthSq()
    {
        return X * X + Y * Y + Z * Z;
    }

    private const float VEC_COMPARE_EPSILON_ABS = 1E-05f;
    public static bool IsConsideredZero(float f)
    {
        return …
Run Code Online (Sandbox Code Playgroud)

floating-point hashcode

12
推荐指数
3
解决办法
2823
查看次数

字典是否被破坏或GetHashCode()仅基于不可变成员?

将对象添加到.NET System.Collections.Generic.Dictionary类时,密钥的哈希码将在内部存储并用于以后的比较.当哈希码在其初始插入字典后发生变化时,它经常变得"不可访问",并且当存在检查(即使使用相同的引用)返回false时,它可能会使其用户感到惊讶(下面的示例代码).

该GetHashCode的文件说:

为对象GetHashCode方法必须一致,只要没有修改确定的该对象的Equals方法返回值的对象的状态返回相同的散列码.

因此,根据GetHashCode文档,只要更改了相等的确定状态,哈希码就会改变,但Dictionary实现不支持这一点.

当前的.NET字典实现是否被打破,因为它错误地忽略了哈希码限额?应该GetHashCode()只基于不可变成员?或者,还有什么可以打破可能的错误二分法吗?

class Hashable
{
    public int PK { get; set; }

    public override int GetHashCode()
    {
        if (PK != 0) return PK.GetHashCode();
        return base.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Hashable);
    }

    public virtual bool Equals(Hashable other)
    {
        if (other == null) return false;
        else if (ReferenceEquals(this, other)) return true;
        else if (PK != 0 && other.PK != 0) return …
Run Code Online (Sandbox Code Playgroud)

.net c# dictionary hashcode immutability

12
推荐指数
2
解决办法
1782
查看次数

基于身份的Java哈希码

Object.hashCode()的默认行为是返回对象的"地址",以便当且仅当a == b时,a.hashCode()== b.hashCode().如果超类已经定义了hashCode(),我如何在用户定义的类中获得此行为?例如:

class A {
  public int hashCode() {
    return 0;
  }
}

class B extends A {
  public int hashCode() {
    // Now I want to return a unique hashcode for each object.
    // In pythonic terms, it'd look something like:
    return Object.hashCode(this);
  }
}
Run Code Online (Sandbox Code Playgroud)

想法?

java identity hashcode

11
推荐指数
2
解决办法
2282
查看次数

如何在不破坏现有Object.Equals()的情况下检查两个对象的属性是否相等?

基本上,GethashCode是不同的,即使它们包含属性的SAME值...那么为什么默认返回diff hashcodes?

public class User
{
    public Int32 Id { get; set; }
    public String Username { get; set; }
}

User a = new User();
a.Id = 1;
a.Username = "Hello";

User b = new User();
b.Id = 1;
b.Username = "Hello";

Console.WriteLine("Hash A: {0} | Hash B: {1}", a.GetHashCode(), b.GetHashCode());
//Hash A: 37121646 | Hash B: 45592480 <-- these values change each time I rerun the app?
Run Code Online (Sandbox Code Playgroud)

有没有更合适的方法来实现它,所以我不会破坏Object.Equals如何为我的对象工作,但我仍然可以根据参数值进行自己的相等检查?

我问的原因是因为我有一个服务:SynchronizeUsers()下载一组用户.我宁愿只更新需要更新的那些,删除同步所说的那些,而不是清除我的用户缓存,而是添加新的.但是,我不能只对这些对象做Object.Equals().

c# equals object hashcode

11
推荐指数
3
解决办法
3万
查看次数

如何在Java中生成共享相同哈希码的字符串?

用Java编写的现有系统使用字符串的哈希码作为其负载平衡的路由策略.

现在,我无法修改系统,但需要生成共享相同哈希码的字符串以测试最差条件.

我从命令行提供这些字符串,并希望系统将所有这些字符串路由到同一目的地.

是否可以生成共享相同哈希码的大量字符串?

要明确这个问题:

String[] getStringsInSameHashCode(int number){
    //return an array in length "number"
    //Every element of the array share the same hashcode. 
    //The element should be different from each other
}
Run Code Online (Sandbox Code Playgroud)

备注:任何hashCode值都可以接受.字符串是什么没有约束.但它们应该彼此不同.

编辑:String类的重写方法是不可接受的,因为我从命令行提供这些字符串.

仪表也是不可接受的,因为这会对系统产生一些影响.

java string hashcode

11
推荐指数
2
解决办法
2万
查看次数

Perl中的快速字符串校验和函数,生成0..2 ^ 32-1范围内的值

我正在寻找具有以下属性的Perl字符串校验和函数:

  • 输入:未定义长度的Unicode字符串($string)
  • 输出:无符号整数($hash),0 <= $hash <= 2^32-1保持(0到4294967295,匹配4字节MySQL unsigned int的大小)

伪代码:

sub checksum {
    my $string = shift;
    my $hash;
    ... checksum logic goes here ...
    die unless ($hash >= 0);
    die unless ($hash <= 4_294_967_295);
    return $hash;
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,校验和函数应该快速运行,并且应该在目标空间(0.. 2^32-1)中稍微均匀地生成值以避免冲突.在这个应用程序中随机碰撞是完全非致命的,但显然我想在可能的范围内避免它们.

鉴于这些要求,解决这个问题的最佳方法是什么?

string perl checksum cpan hashcode

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

我是否使用Google Guava正确实现了equals和hashCode?

我正在使用hibernate并需要覆盖equals和hashCode().我选择使用google-guava的equals和hashCode助手.

我想知道我在这里是否遗漏了什么.

我有id/image和filePath的 get/set方法.

@Entity
@Table(name = "IMAGE")
public class ImageEntity {
    private Integer idImage;
    private String filePath;

    @Override
    public int hashCode() {
        return Objects.hashCode(getFilePath());
    }

    @Override
    public boolean equals(final Object obj) {
        if(obj == this) return true;
        if(obj == null) return false;

        if(obj instanceof ImageEntity){
            final ImageEntity otherImage = (ImageEntity) obj;
            return Objects.equal(getFilePath(), otherImage.getFilePath());
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

进入继承并在这里有一个样本

java equals hashcode guava

10
推荐指数
2
解决办法
7974
查看次数

hashcode()和equals()方法

所以我对hashcode()和equals()方法有疑问

假设我只是写了一个非常基本的程序来覆盖这两个方法

import java.util.*;

class Employee
{
   private String name;
   private int empid;


   public Employee(String name,int empid)
   {
       this.name=name;
       this.empid=empid;
   }


   public int getEmpid()
   {
       return empid;
   }


   public String getName()
   {
       return name;
   }


   public boolean equals(Object obj)
   {
       System.out.println("equals has just been called...");
       Employee e1=(Employee)obj;
       return ((name.equals(e1.name)) && (empid==e1.empid));
   }


   public int hashCode()
   {
       System.out.println("hashcode called...");
       return empid;
   }

}
Run Code Online (Sandbox Code Playgroud)

然后,假设我编写了另一个类来添加和迭代HashSet中的元素

class Five
{
   public static void main(String args[])
   {
       HashSet hs1=new HashSet();
       hs1.add(new Employee("Alex",25));
       hs1.add(new Employee("Peter",25));
       hs1.add(new …
Run Code Online (Sandbox Code Playgroud)

java equals hashcode hashset

10
推荐指数
1
解决办法
6926
查看次数

使用哈希码获取唯一ID

我在基于java的系统中工作,我需要为可视显示中的某些元素设置id.一类元素是字符串,所以我决定使用String.hashCode()方法来获取这些元素的唯一标识符.

然而,我遇到的问题是,如果id是负数并且String.hashCode经常返回负值,我在borks工作的系统.一个快速的解决方案是在hashcode调用周围使用Math.abs()来保证肯定的结果.我对这种方法感到疑惑的是,两个不同元素具有相同哈希码的可能性是多少?

例如,如果一个字符串返回的哈希码为-10,另一个字符串返回的哈希码为10,则会发生错误.在我的系统中,我们讨论的是通常不超过30个元素的对象集合,所以我不认为这确实是一个问题,但我很好奇数学所说的.

java unique hashcode

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

如何在阵列中使用Java 7+'Objects.hash()'?

我非常喜欢Java 7+写作hashCode()方式:

@Override
public int hashCode() {
    Objects.hash(field1, field2);
}
Run Code Online (Sandbox Code Playgroud)

但它无法正常使用数组.以下代码:

@Override
public int hashCode() {
    Objects.hash(field1, field2, array1, array2);
}
Run Code Online (Sandbox Code Playgroud)

将不会工作,因为array1和array2常规hashCode()而不是Arrays.hashCode()被调用.

如何Objects.hash()以正确的方式使用数组?

java arrays hashcode java-7

10
推荐指数
2
解决办法
1560
查看次数