Tag: 哈希码

我可以使用GetHashCode()进行所有字符串比较吗?

我想基于要搜索的对象和一些搜索设置来缓存一些搜索结果。 但是:这会创建相当长的缓存键,我想我会为它创建一个快捷方式,我想我会使用GetHashCode() 。 所以我想知道, GetHashCode()总是生成一个不同的数字,即使我有很长的字符串或只有这个不同:’ä’而不是’a’ 我尝试了一些字符串, 似乎答案是肯定的,但不理解GetHashCode()行为并没有给我真正的感觉,我是对的。 而且因为当你没有准备好时(客户端正在查看错误搜索的缓存结果),它会突然出现,我想确定… 编辑:如果MD5可以工作,我可以改变我的代码不使用GetHashCode ofcourse,目标是得到一个短的(呃)字符串比原来(> 1000字符)

将非可序列化类转换为字节数组

我有一个场景,我在多个非常不同的系统之间同步数据。 (数据本身很相似,但不同系统上的表格格式完全不同。)为了协助这种同步,我有一个数据库表,它存储来自每个系统的对象哈希值以及项目键和其他相关信息。 当来自任一系统的对象的散列改变时,我更新另一个。 我的数据库表看起来像这样。 CREATE TABLE [dbo].[SyncHashes]( [SyncHashId] [int] IDENTITY(1,1) NOT NULL, [ObjectName] [nvarchar](50) NULL, [MappingTypeValue] [nvarchar](25) NULL, [MappingDirectionValue] [nvarchar](25) NULL, [SourceSystem] [nvarchar](50) NULL, [SourceKey] [nvarchar](200) NULL, [SourceHash] [nvarchar](50) NULL, [TargetSystem] [nvarchar](50) NULL, [TargetKey] [nvarchar](200) NULL, [TargetHash] [nvarchar](50) NULL, [UpdateNeededValue] [nvarchar](max) NULL, [CreatedOn] [datetime] NULL, [ModifiedOn] [datetime] NULL, [Version] [timestamp] NOT NULL, [IsActive] [bit] NOT […]

Hashcode实现双精度

我之前已经问了一个关于这个课程的问题,但这里又是一个问题。 我创建了一个Complex类: public class Complex { public double Real { get; set; } public double Imaginary { get; set; } } 我正在实现Equals和Hashcode函数,而Equal函数考虑了一定的精度。 我使用以下逻辑: public override bool Equals(object obj) { //Some default null checkint etc here, the next code is all that matters. return Math.Abs(complex.Imaginary – Imaginary) <= 0.00001 && Math.Abs(complex.Real – Real) <= 0.00001; } […]

如何使用哈希字节比较2个图像是否相同?

private void button1_Click(object sender, EventArgs e) { Bitmap im1 = new Bitmap(@”C:\Users\user\Downloads\CaptchaCollection\1.png”); Bitmap im2 = new Bitmap(@”C:\Users\user\Downloads\CaptchaCollection\2.png”); if (HashImage(im1) == HashImage(im2)) { MessageBox.Show(“Same Image”); } else { MessageBox.Show(“Different Image”); } } 如果单击该按钮,它将比较这两个图像。 以下是用于散列图像的代码。 public byte[] HashImage(Bitmap image) { var sha256 = SHA256.Create(); var rect = new Rectangle(0, 0, image.Width, image.Height); var data = image.LockBits(rect, ImageLockMode.ReadOnly, […]

什么是适合2D点结构的`GetHashCode()`算法(避免碰撞)

请考虑以下代码: struct Vec2 : IEquatable { double X,Y; public bool Equals(Vec2 other) { return X.Equals(other.X) && Y.Equals(other.Y); } public override bool Equals(object obj) { if (obj is Vec2) { return Equals((Vec2)obj); } return false; } // this will return the same value when X, Y are swapped public override int GetHashCode() { return X.GetHashCode() ^ […]

object.GetHashCode()能否为不同机器上的相同对象(字符串)产生不同的结果?

是否有可能同一个对象,特别是string或任何原始类型或非常简单的类型(如struct ),在不同的机器上调用时生成.GetHashCode()方法的不同值? 例如,表达式”Hello World”.GetHashCode()可以在不同的机器上生成不同的值。 我主要是要求C#.NET,但我想这可能适用于Java甚至其他语言? 编辑: 正如下面的答案和评论所指出的那样,我知道.GetHashCode()可以被覆盖 ,并且不能保证它在不同版本的框架之间产生的结果。 因此,重要的是要澄清我有简单的类型(不能inheritance,因此GetHashCode()被覆盖)并且我在所有机器上使用相同版本的框架。

C# – 类的通用HashCode实现

我正在研究如何为类构建最好的HashCode,我看到了一些算法。 我看到了这一个: Hash Code实现 ,似乎是.NET类的HashCode方法是类似的(参见反映代码)。 所以问题是,为什么不创建上面的静态类来自动构建HashCode,只需传递我们认为是“键”的字段。 // Old version, see edit public static class HashCodeBuilder { public static int Hash(params object[] keys) { if (object.ReferenceEquals(keys, null)) { return 0; } int num = 42; checked { for (int i = 0, length = keys.Length; i < length; i++) { num += 37; if (object.ReferenceEquals(keys[i], null)) […]

为什么将HashTable的长度设置为素数是一个好习惯?

当我点击这段时,我正在阅读Eric Lippert 关于GetHashCode指南和规则的最新博客post: 我们在这里可能更聪明; 就像List在它满了时resize一样,bucket set也可以自己resize,以确保平均bucket长度保持低位。 此外,由于技术原因,通常最好将存储桶设置长度设为素数,而不是100.我们可以对此哈希表进行大量改进。 但是这个哈希表的简单实现的快速草图现在可以做到。 我想保持简单。 所以看起来我错过了一些东西。 为什么将它设置为素数是一个好习惯?

在C#中简化覆盖等于(),GetHashCode()以获得更好的可维护性

我经常发现我的自我重写Equals()和GetHashCode()来实现具有相同属性值的业务对象相等的语义。 这会导致代码重复写入并且易于维护(属性被添加,并且一个/两个覆盖都不会更新)。 代码最终看起来像这样(欢迎对实现的评论): public override bool Equals(object obj) { if (object.ReferenceEquals(this, obj)) return true; MyDerived other = obj as MyDerived; if (other == null) return false; bool baseEquals = base.Equals((MyBase)other); return (baseEquals && this.MyIntProp == other.MyIntProp && this.MyStringProp == other.MyStringProp && this.MyCollectionProp.IsEquivalentTo(other.MyCollectionProp) && // See http://stackoverflow.com/a/9658866/141172 this.MyContainedClass.Equals(other.MyContainedClass)); } public override int GetHashCode() { int hashOfMyCollectionProp […]

将System.Decimal转换为System.Guid

我有一个大字典,其中键是十进制的,但System.Decimal的GetHashCode()非常糟糕。 为了certificate我的猜测,我运行了一个带有100.000 neigboring小数的for循环并检查了分布。 100.000个不同的十进制数仅使用2个(两个!!!)不同的哈希码。 十进制表示为16个字节。 就像Guid一样! 但是Guid的GetHashCode()发行版非常好。 如何在C#中将小数转换为Guid尽可能便宜? 不安全的代码没问题! 编辑:请求测试,所以这里是代码: decimal d = 96000000000000000000m; Dictionary hashcount = new Dictionary(); int length = 100000; for (int i = 0; i < length; i++) { int hashcode = d.GetHashCode(); int n; if (hashcount.TryGetValue(hashcode, out n)) { hashcount[hashcode] = n + 1; } else { hashcount.Add(hashcode, 1); } […]