相关疑难解决方法(0)

什么是哈希码计算的合理素数?

Eclipse 3.5有一个非常好的功能来生成Java hashCode()函数.它会产生例如(稍微缩短:)

class HashTest {
    int i;
    int j;        
    public int hashCode() {
        final int prime = 31;
        int result = prime + i;
        result = prime * result + j;
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

(如果类中有更多属性,result = prime * result + attribute.hashCode();则对每个附加属性重复.对于int.可以省略.hashCode().)

这似乎很好,但选择31为素数.它可能来自Java StringhashCode实现,它被用于性能原因,这些原因在引入硬件乘法器之后很久就消失了.对于i和j的小值,这里有许多哈希码冲突:例如(0,0)和(-1,31)具有相同的值.我认为这是一个Bad Thing(TM),因为经常出现小值.对于String.hashCode,您还会发现许多具有相同哈希码的短字符串,例如"Ca"和"DB".如果选择大素数,如果选择素数,此问题就会消失.

所以我的问题是:选择什么是好的素数?你用什么标准来找到它?

这是一个普遍的问题 - 所以我不想给i和j一个范围.但我认为在大多数应用中,相对较小的值比较大的值更常出现.(如果你有大的值,素数的选择可能不重要.)它可能没有多大区别,但更好的选择是一种简单明了的方法来改善这一点 - 那么为什么不这样做呢?Commons lang HashCodeBuilder也提出了奇怪的小值.

(澄清:这不是重复为什么String中的Java的hashCode()使用31作为乘数?因为我的问题不关心JDK中31的历史,而是关于新代码中更好的值使用相同的基本模板.没有任何答案试图回答.)

java primes hashcode

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

快速简单的哈希码组合

人们可以推荐快速简单的方法来组合两个对象的哈希码.我并不太担心碰撞,因为我有一个Hash Table可以有效地处理这个问题我只想要尽可能快地生成代码的东西.

阅读SO和网络似乎有几个主要候选人:

  1. 异或
  2. 使用Prime乘法进行异或
  3. 简单的数字运算,如乘法/除法(溢出检查或环绕)
  4. 构建一个String然后使用String类的Hash Code方法

人们会推荐什么?为什么?

c# algorithm hash hashcode

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

GetHashCode重写包含泛型数组的对象

我有一个包含以下两个属性的类:

public int Id      { get; private set; }
public T[] Values  { get; private set; }
Run Code Online (Sandbox Code Playgroud)

我做了它IEquatable<T>并覆盖了object.Equals这样的:

public override bool Equals(object obj)
{
    return Equals(obj as SimpleTableRow<T>);
}

public bool Equals(SimpleTableRow<T> other)
{
    // Check for null
    if(ReferenceEquals(other, null))
        return false;

    // Check for same reference
    if(ReferenceEquals(this, other))
        return true;

    // Check for same Id and same Values
    return Id == other.Id && Values.SequenceEqual(other.Values);
}
Run Code Online (Sandbox Code Playgroud)

object.Equals我有覆盖时,我GetHashCode当然也必须覆盖.但是我应该实现什么代码?如何从通用数组中创建哈希码?我如何将它与Id整数相结合?

public override int …
Run Code Online (Sandbox Code Playgroud)

c# arrays generics hashcode

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

将泛型与null相比较,可以是值或引用类型?

public void DoFoo<T>(T foo) where T : ISomeInterface<T>
{
    //possible compare of value type with 'null'.
    if (foo == null) throw new ArgumentNullException("foo");
}
Run Code Online (Sandbox Code Playgroud)

我故意只检查null,因为我不想限制a ValueType等于它default(T).我的代码以这种方式编译和工作(ReSharper抱怨,但不是CodeAnalysis).虽然我想知道:

  • 有没有更标准的方法来处理这种情况?
  • 有没有可能出现这个问题?
  • 当我打电话并传递值类型时,真正发生了什么?

c# generics null value-type null-check

41
推荐指数
2
解决办法
4837
查看次数

C#字符串比较忽略空格,回车或换行符

如何在C#中比较2个字符串,忽略大小写,空格和任何换行符.我还需要检查两个字符串是否为空,然后将它们标记为相同.

谢谢!

.net c# string

40
推荐指数
5
解决办法
7万
查看次数

Equals和GetHashCode的最佳策略是什么?

我正在使用域模型,并且正在思考我们在.NET中实现这两种方法的各种方法.你最喜欢的策略是什么?

这是我目前的实施:

public override bool Equals(object obj)
{
    var newObj = obj as MyClass;

    if (null != newObj)
    {
        return this.GetHashCode() == newObj.GetHashCode();
    }
    else
    {
        return base.Equals(obj);
    }
}

// Since this is an entity I can use its Id
// When I don't have an Id, I usually make a composite key of the properties
public override int GetHashCode()
{
    return String.Format("MyClass{0}", this.Id.ToString()).GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)

.net c# equals gethashcode

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

实现此复合GetHashCode()的最佳方法是什么

我有一个简单的课程:

public class TileName {
    int Zoom, X, Y;

    public override bool Equals (object obj)
    {
        var o = obj as TileName;
        return (o != null) && (o.Zoom == Zoom) && (o.X == X) && (o.Y == Y);
    }

    public override int GetHashCode ()
    {
        return (Zoom + X + Y).GetHashCode();
    }
}
Run Code Online (Sandbox Code Playgroud)

我很好奇,如果我做了类似的事情,我会得到更好的哈希码分布:

    public override int GetHashCode ()
    {
        return Zoom.GetHashCode() + X.GetHashCode() + Y.GetHashCode();
    }
Run Code Online (Sandbox Code Playgroud)

这个类将被用作Dictionary键,所以我确实希望确保有一个不错的发行版.

.net c# hash computer-science

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

覆盖GetHashCode

如您所知,GetHashCode返回一个半唯一值,可用于标识集合中的对象实例.作为一种好的做法,建议覆盖此方法并实现自己的方法.

我的问题是 - 在处理自定义对象时是否覆盖此方法?如果是这样,您使用什么算法来生成唯一ID?

我正在考虑生成GUID,然后从该识别器获取整数数据.

c# algorithm methods overriding gethashcode

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

如何在C#中将List <T>转换为HashSet <T>?

我有一个具有重复对象的List.要解决这个问题,我需要将List转换为HashSet(在C#中).有谁知道怎么样?

c# list hashset

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

良好的GetHashCode()覆盖了关于订单的Foo对象列表

EnumerableObject : IEnumerable<Foo>

包裹一个 List<Foo>

如果EnumerableObject a.SequenceEquals( EnumerableObject b),那么他们是平等的.

因此,GetHashCode必须实施.问题是XORing列表中的每个元素将返回任何列表的相同哈希码,所有列表都包含所有且只有相同的元素,而不管顺序如何.就工作而言,这是好的,但会导致许多冲突,这将减慢检索速度等.

GetHashCode对于依赖于顺序的对象列表,什么是一种好的,快速的方法?

c# algorithm hashcode gethashcode

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