Tag: hash

为什么微软希望不用NaN修复错误的Equals和GetHashCode实现?

在.NET Framework中,浮点类型( System.Double和System.Single )的Equals(object)和GetHashCode()的实现( override )是错误的 。 引用MSDN GetHashCode(object)规范 : 哈希函数必须具有以下属性: •如果两个对象比较相等,则每个对象的GetHashCode方法必须返回相同的值。 但是,如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值。 如果您使用不同的二进制表示forms获取两个NaN值,则两个对象在Equals方法下的比较相等,但哈希码(几乎总是)是不同的。 现在,Microsoft Connect 已报告此错误。 但他们为什么不解决这个问题? 修复很容易:要么让不同的NaN 不相等,要么选择一个固定的哈希码来返回任何NaN 。 修复不会破坏任何东西:今天的事情,当使用不同的NaN时,没有任何作用。 你能想出任何不解决这个问题的理由吗? 这是一个说明当前行为的简单示例: using System; using System.Collections.Generic; using System.Linq; static class Program { const int setSize = 1000000; // change to higher value if you want to waste even more memory const double oneNaNToRuleThemAll […]

创建用于数据库的哈希码(即不使用GetHashCode)

我最近接受了GetHashCode()方式的指示,特别是“GetHashCode的消费者不能依赖它随时间推移或跨appdomains稳定”(来自Eric Lippert博客文章 )。 不幸的是,我一直在数据库中使用它来尝试加速查找(通过插入GetHashCode的结果而不是对文本字符串进行搜索)。 我现在意识到这是一件非常糟糕的事情。 所以我想知道我能做些什么呢。 是否有任何给定字符串将保证返回一个合理的抗冲突整数,我可以用于查找? 我可以自己写一些东西,但我希望有一些内置的东西,我可以使用,而不必去加密库中的东西,感觉有点重量级。

覆盖GetHashCode()

在本文中 ,Jon Skeet提到他通常使用这种算法来覆盖GetHashCode() 。 public override int GetHashCode() { unchecked // Overflow is fine, just wrap { int hash = 17; // Suitable nullity checks etc, of course 🙂 hash = hash * 23 + Id.GetHashCode(); return hash; } } 现在,我已经尝试过使用它了,但是Resharper告诉我,方法GetHashCode()应该只使用只读字段进行散列(尽管它编译得很好)。 什么是一个好的做法,因为现在我不能真正让我的字段是只读的? 我尝试通过Resharper生成这个方法,这是结果。 public override int GetHashCode() { return base.GetHashCode(); } 这没什么贡献,说实话……

简单实现SHA-3 Keccak散列到C#的错误输出?

我会简短而简单! 我正在学习C#,我正在努力让HashLib库@ https://hashlib.codeplex.com/为新的SHA-3 Keccak算法工作。 我写了一个简单的Console / Win32应用程序,据说必须输出正确的哈希码,但事实并非如此! using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Diagnostics; using HashLib; using System.Threading.Tasks; namespace ConsoleApplication5 { class Program { static void Main(string[] args) { { string passPhrase = “”; IHash hash = HashFactory.Crypto.SHA3.CreateKeccak512(); HashResult r = hash.ComputeString(passPhrase, System.Text.Encoding.ASCII); Console.WriteLine(r.ToString().ToLower().Replace(“-“,””)); Console.WriteLine(“{0}, {1}, {2}”, hash.BlockSize, hash.HashSize, hash.Name); […]

如何将字节数组(MD5哈希)转换为字符串(36个字符)?

我有一个使用哈希函数创建的字节数组。 我想将此数组转换为字符串。 到目前为止这么好,它会给我hex字符串。 现在我想使用不同于hex字符的东西,我想用这36个字符编码字节数组 :[az] [0-9] 。 我该怎么办? 编辑:我之所以这样做,是因为我想要一个比hex字符串更小的字符串。

使用哪一个:托管与非托管哈希算法

在常规的C#应用​​程序中,哪个类用于散列: xxxManaged或xxx (即SHA1Managed vs SHA1 )以及为什么?

Asp.net MVC – 如何哈希密码

如何将用户输入(密码)哈希到数据库,然后在登录期间读取哈希密码? 我相信解决方案是在注册时散列密码,其中密码在db中保存为散列。 登录后,它应该取消哈希并将其密码与用户密码输入进行比较。 但我不知道该怎么做。 我允许密码在db中具有nvarchar(MAX) ,因为散列密码通常很长。 [Required] [StringLength(MAX, MinimumLength = 3, ErrorMessage = “min 3, max 50 letters”)] public string Password { get; set; } 寄存器: [HttpPost] public ActionResult Register(User user) { if (ModelState.IsValid) { var u = new User { UserName = user.UserName, Password = user.Password }; db.Users.Add(u); db.SaveChanges(); return RedirectToAction(“Login”); } }return View(); […]

为什么String.GetHashCode()在32位和64位版本的CLR中实现不同?

string.GetHashCode()的32位和64位版本之间的差异背后的技术原因是什么? 更重要的是,为什么64位版本在遇到NUL字符时似乎终止了它的算法? 例如,在64位CLR下运行时,以下表达式都返回true。 “\0123456789”.GetHashCode() == “\0987654321”.GetHashCode() “\0AAAAAAAAA”.GetHashCode() == “\0BBBBBBBBB”.GetHashCode() “\0The”.GetHashCode() == “\0Game”.GetHashCode() 当我们将这样的字符串用作Dictionary中的键时,这种行为(bug?)表现为性能问题。

Object.GetHashCode

我的问题可能会重复Object.GetHashCode()的默认实现,但我再次问,因为我不理解那个问题的接受答案。 首先,我对前一个问题的接受答案有三个问题,引用了一些文档如下: “但是,因为在垃圾回收期间回收对象后可以重用此索引,所以可以为两个不同的对象获取相同的哈希码。” 这是真的? 在我看来,两个对象将不具有相同的哈希码,因为在对象被垃圾收集(即不再存在)之前,不会重用对象的代码。 “另外,表示相同值的两个对象只有在完全相同的对象时才具有相同的哈希码。” 这是一个问题吗? 例如,我想将一些数据与DOM树中的每个节点实例相关联。 为此,“节点”必须具有标识或哈希码,以便我可以将它们用作数据字典中的键。 不是哈希码,它标识它是否是“完全相同的对象”,即“引用相等而不是”值相等“,我想要什么? “这个实现对于散列并不是特别有用;因此,派生类应该覆盖GetHashCode” 这是真的? 如果它对散列不好,那么如果有什么好处,为什么它甚至被定义为Object的方法呢? 我的最终(也许对我来说最重要的)问题是,如果我必须发明/覆盖具有“引用相等”语义的任意类型的GetHashCode()实现,则以下是一个合理且良好的实现: class SomeType { //create a new value for each instance static int s_allocated = 0; //value associated with this instance int m_allocated; //more instance data … plus other data members … //constructor SomeType() { allocated = ++s_allocated; } //override GetHashCode public […]

GetHashCode扩展方法

在阅读StackOverflow上关于重写GetHashCode()所有问题和答案之后,我编写了以下扩展方法,以便轻松方便地覆盖GetHashCode() : public static class ObjectExtensions { private const int _seedPrimeNumber = 691; private const int _fieldPrimeNumber = 397; public static int GetHashCodeFromFields(this object obj, params object[] fields) { unchecked { //unchecked to prevent throwing overflow exception int hashCode = _seedPrimeNumber; for (int i = 0; i < fields.Length; i++) if (fields[i] != null) hashCode […]