我有一个对象的列表,在我们的例子中被称为规则,这个对象本身是一个字段列表,我必须对其进行哈希码比较,因为我们不能在系统中复制规则.
即假设我有两个规则R1和R2,字段为A和B.
现在,如果R1中A和B的值分别为7和2.
在R2中它分别是3和4然后我用来检查系统中规则的重复性的过程是哈希码比较失败
我使用的方法是
for(Rule rule : rules){
changeableAttrCode=0;
fieldCounter=1;
attributes = rule.getAttributes();
for(RuleField ruleField : attributes){
changeableAttrCode = changeableAttrCode + (fieldCounter * ruleField.getValue().hashCode());
fieldCounter++;
}
parameters = rule.getParameters();
for(RuleField ruleField : parameters){
changeableAttrCode = changeableAttrCode + (fieldCounter * ruleField.getValue().hashCode());
fieldCounter++;
}
changeableAttrCodes.add(changeableAttrCode);
Run Code Online (Sandbox Code Playgroud)
这里是changeableAttrCodes,我们存储所有规则的哈希码.
那么请建议我更好的方法,以便将来不会出现这种问题,也可以看出系统中的规则错误.
提前致谢
假设我们在Scala中有三组字符串.一个有元素A,B,C.两个具有元素B,C,D.三个有元素J,K,I.
我的第一个问题是,是否有任何方法可以使这两组中的任何两个的哈希码相同?我的第二个问题是,如果我将D添加到One和A到Two以获得新的Set One.n和Two.n,则One.n和Two.n的哈希码是相同的吗?
所以我知道我可以简单地通过执行.hashCode()将字符串转换为哈希码,但有没有一种方法可以转换(或使用其他一些函数,如果有一个),而不是返回一个整数返回一个双0和1?我想把数字除以最大可能的整数,但不确定是否有更好的方法.
*编辑(有关我为什么要这样做的更多信息):我正在进行数学运算,并且我正在尝试将不同的对象分组以在其组中执行相同的数学运算但是在函数中具有不同的参数.每个成员都有一个"组合"它们的特征列表...所以我想把特征放入一个字符串然后对其进行哈希编码并从中找到它们的组值
我目前正在比较两个相同类型的复杂对象,其中多个字段由自定义对象类型的数据结构组成.假设没有任何自定义对象覆盖该hashCode()方法,如果我比较对象中每个字段的哈希码,并且它们结果是相同的,那么我是否100%确信比较对象的内容是相同?如果没有,假设我不能使用任何外部库,那么您建议使用哪种方法来比较两个对象.
当重写equals()和hashCode()一个类的方法,将采取下列措施的工作?
查看对象是否相等的所有逻辑都是在我的equals()方法中完成的.该类有一个静态变量(我们称之为hashCodeReturn),设置为1.
当equals方法达到返回false的逻辑时,它会加1 hashCodeReturn
该hashCode()则简单地返回hashCodeReturn值
有什么理由不行吗?
非常感谢.
我今天发现了这段代码:
private static class Node{
private final int code1;
private final int code2;
public Node(int code1, int code2) {
this.code1 = code1;
this.code2 = code2;
}
@Override
public int hashCode() {
return (code1 * 31) ^ code2;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Node) {
Node node = (Node) obj;
return node.code1 == code1 && node.code2 == code2;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
哈希码是否有充分的理由使用(code1*31)^ code2; ?
根据我的理解,创建哈希码的常用方法是将当前哈希码(或第一个字段)乘以素数,并为每个字段添加下一个字段.
为什么在这里需要电源 XOR运算符?
"random".hashCode()返回值-938285885.是否预期负值hashCode()?
根据以下问题,有一种方法hashCode()可以计算字符串,但是使用它,随着字符串长度的增加,值不会继续增加,最终会大于Integer.MAX_VALUE?
我试图计算总和为n的1,5,10和25的组合数.鉴于我不想重复(例如1 + 5 = 6和5 + 1 = 6).我正在使用hashSet.我实现了一个名为的类ResultSet,它在解决方案中保存了1,5,10和25的数量,并且我覆盖了该equals方法.但是,由于某种原因,我的解决方案hashSet不断返回重复值.为什么?
import java.util.HashSet;
public class Solution {
public static void main(String[] args) {
int N = 6;
int combinationsSolution = new Combine(N).getSolution();
System.out.println("N= " + N + " Number of solutions= " + combinationsSolution);
}
}
class Combine {
private int solution;
private int n;
private HashSet<ResultSet> cacheUnordered = new HashSet<ResultSet>();
public Combine(int N) {
this.n = N;
this.solution = solve(n);
}
public int …Run Code Online (Sandbox Code Playgroud) 我认为这些集合的GetHashCode函数不会将其哈希码基于其列表中的项目,这很奇怪.
我需要这个才能提供脏检查(你有未保存的数据).我编写了一个覆盖GetHashCode方法的包装类,但我发现这不是默认实现,这很奇怪.
我想这是性能优化?
class Program
{
static void Main(string[] args)
{
var x = new ObservableCollection<test>();
int hash = x.GetHashCode();
x.Add(new test("name"));
int hash2 = x.GetHashCode();
var z = new List<test>();
int hash3 = z.GetHashCode();
z.Add(new test("tets"));
int hash4 = z.GetHashCode();
var my = new CustomObservableCollection<test>();
int hash5 = my.GetHashCode();
var test = new test("name");
my.Add(test);
int hash6 = my.GetHashCode();
test.Name = "name2";
int hash7 = my.GetHashCode();
}
}
public class test
{
public test(string name)
{
Name = name; …Run Code Online (Sandbox Code Playgroud) 我目前正在通过MOOC学习Java的哈希码,并按照他们的教程学习。但是,当哈希图中明显存在一个值时,预期输出将返回null。我的覆盖代码如下:
public class Plate{
private final String regCode;
private final String country;
// Counstructors
...
// accessors... only showing name for less clutter
getCode()
getCountry()
@Override // toString
public String toString(){
return country + " " + regCode;
}
@Override // equals
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(getClass() != obj.getClass()){
return false;
}
Plate cmp = (Plate) obj;
if(this.country.equals(cmp.getCountry())){
return false;
}
if(this.regCode == null || this.regCode.equals(cmp.getCode())){
return false;
}
return true;
}
///////////////////////////////////// Below …Run Code Online (Sandbox Code Playgroud)