我一直在从事我的项目(我也在使用 EMF Compare)。我需要为我使用的每个对象保留一个唯一的 ID,这就是我决定使用 IdentityHashCode 的原因,据我所知,该值在编译过程中是相同的。
我已将对象作为另一个类的方法中的参数给出,但是当我尝试获取哈希码时,这与打印对象的值时看到的不同。
像这样的东西:
System.out.println("The Object is: "+obj)
System.out.println("The hash ID is: +Integer.toHexString(System.identityHashCode(obj)));
但结果我得到了这个:
对象是:***xxxxxxxxxxxxxx***.EntityImpl@18e588c (name: Comment) has been removed.
哈希 ID 为:1ec1758
正如您所看到的,两个值(18e588c和1ec1758)完全不同,但我不明白为什么。到目前为止,我所做的唯一一件事(并且有效)是获取对象的 String,然后使用 substring 方法来获取18e588c(对于本例)
我将不胜感激任何答案。
我有一张地图:
static Map<String, String> = getMap(); //getting a map from a config file.
Run Code Online (Sandbox Code Playgroud)
现在,在这张地图中,我需要使用 KEYS 执行不区分大小写的搜索。我没有将值放入映射中,不是通过 put 函数,但您可以将其视为以键值格式存储在数据库中的值,并将其作为映射检索。我需要进行案例不敏感搜索。
经过研究,使用TreeMap可以解决问题,但效率不高 --> O(log n)
或者覆盖HashMap的get()方法,创建我自己的HashMap。但这将包括覆盖许多方法,而且我不想要这么多,它不是非常重要的代码的一部分。
现在我正在将这些值以小写形式存储在数据库中并进行检查。但这使得数据库中容易出错且不可读。
是否可以有更简单的方法来做到这一点?
我有一个名为的类Dish,我在ArrayLists 内处理它,所以我必须重写默认hashCode()方法。
@Override
public int hashCode() {
int hash =7;
hash = 3*hash + this.getId();
hash = 3*hash + this.getQuantity();
return hash;
}
Run Code Online (Sandbox Code Playgroud)
当我得到两个带有id=4、quan=3和id=5、的菜肴时quan=0,hashCode()因为两者是相同的;
((7*3)+4)*3+3 = 78
((7*3)+5)*3+0 = 78
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?或者我选择的幻数 7 和 3 是错误的?
如何正确覆盖hashCode()以便它生成唯一的哈希值?
PS:从我从谷歌和SO搜索到的内容来看,人们使用不同的数字但使用相同的方法。如果问题出在数字上,我如何明智地选择实际上不会增加乘法成本并且同时即使对于更多数量的属性也能很好地工作的数字。
假设我有 7 个 int 属性和我的第二个魔法号。是 31,最终的哈希值将是第一个幻数。* 27512614111,即使我的所有属性都是 0。 那么,在哈希值不达到数十亿的情况下,如何才能做到这一点,从而使我的处理器没有负担呢?
我找不到任何有关使用ssdeep 哈希算法计算的哈希值最大长度的信息。
我想通过其十六进制摘要表示将 ssdeep 哈希值存储在数据库中,但因此我需要指定该值的长度。
我有一个 Employee 类,有 2 个属性 id 和 name。我将重写 hashcode 和 equals 方法,如下所示。
员工.java:
import java.util.Objects;
public class Employee {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj …Run Code Online (Sandbox Code Playgroud) Class A {
private String test1;
private String test2;
}
Class Feature {
private List<A> obj;
/*
HashCode which should return same value even though i change ordering of objects in List
*/
}
Run Code Online (Sandbox Code Playgroud)
当前行为:
> List<A> contains [obj1, obj2, obj3] -> Some hashCode (Ex: 9058203945)
> List<A> contains [obj2, obj1, obj3] -> Some other hashCode (Ex:-23423423)
Run Code Online (Sandbox Code Playgroud)
我想要的是,如果我更改 List 中元素的顺序,我的 List 的 hashCode 应该相同。
有什么帮助吗?
提前致谢
我在 Java 应用程序的每个 Hibernate 实体(如果没有继承)中创建equals()和方法。hashCode()然而,我有点困惑,想确定我的定义是否正确。您能否澄清以下问题?
在 IntelliJ 中,当我使用“生成”功能(通过 Alt + Insert)时,有一些模板,例如 IntelliJ Default、Java 7+ 等。我应该使用哪个模板?
使用“生成”功能时,我应该在equals() and hashCode()以下实体的方法中包含哪个字段?
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@Column(unique = true)
private String email;
// getter, setter, constructor...
}
Run Code Online (Sandbox Code Playgroud)
我应该使用注释来实现简单易用吗@EqualsAndHashCode?或者它不灵活,我应该更喜欢明确地实施吗?
我对Java中对象的哈希码方法的理解是:需要计算对象的哈希码,该哈希码又用于计算对象在哈希数据结构(如hashMap)中的索引/存储桶位置。
那么,对于不与哈希数据结构一起使用的类,不需要在其中实现 hashCode() 方法,这样说是否正确?换句话说,对于非哈希数据结构来说,重写 equals() 方法是否足够?
如果我的假设是错误的,也请纠正我。
我试图使用编程语言提供的默认哈希函数生成三个不同的字符串 A、B 和 C,以便它们的哈希值全部相等。具体来说,我需要确保A不等于B,B不等于C,A不等于C。
我尝试了多种方法,但尚未成功找到解决方案。我正在寻求帮助来实现可以满足这些要求的方法或算法。所有三个字符串的哈希值必须相同,这一点至关重要。
这是我的实现,但是它仍然不完整,因为我与前两个字符串发生了冲突,但与第三个字符串没有发生冲突。
var dictionary = new Dictionary<int, string>();
int collusionCounter = 0, stringCounter = 0;
string myString;
int hash = 0;
List<string> myList = new List<string>();
while (true)
{
stringCounter++;
myString = stringCounter.ToString();
try
{
hash = myString.GetHashCode();
dictionary.Add(hash, myString);
}
catch (Exception)
{
if (dictionary.ContainsKey(hash))
{
myList.Add(myString);
collusionCounter++;
if (collusionCounter == 2)
{
break;
}
}
continue;
}
}
var A = myList[0];
var B = myList[1];
var C = dictionary[hash];
Console.WriteLine($"{A.GetHashCode()} {B.GetHashCode()} {C.GetHashCode()}");
Run Code Online (Sandbox Code Playgroud)
hier …
我需要像在c ++中使用map一样,阻碍c中的键和值。
请分享最简单的示例以在c中的存储中存储唯一的键和值。键,我可以是任何字符串,值将是字符串。
谢谢