Tag: 哈希码

什么是`hashCode`的默认实现?

如果没有重写hashCode方法,那么hashCode的默认实现是什么?

如何计算一个string列表的好散列码?

背景: 我有一个简短的string列表。 string的数量并不总是相同的,但几乎总是“less数”的顺序, 在我们的数据库中将这些string存储在第二个规范化的表中 这些string写入数据库后永远不会更改。 我们希望能够在查询中快速匹配这些string,而无需进行大量的连接。 所以我正在考虑将所有这些string的哈希码存储在主表中,并将其包含在我们的索引中,因此只有在哈希码匹配时才能通过数据库处理联接。 那么如何获得一个好的散列码呢? 我可以: 将所有string的哈希码加在一起 XOR与每个string后面的结果相乘(用31表示) 把所有的string集合在一起,然后得到哈希码 其他方式 那么人们会怎么想呢? 最后,我只是连接string并计算连接的哈希码,因为它很简单,而且工作得很好。 (如果你在意我们正在使用.NET和SqlServer) Bug!,Bug! Eric Lippert 引用GetHashCode的指导原则和规则 System.String.GetHashCode的文档特别指出,两个相同的string可以在CLR的不同版本中具有不同的哈希代码,实际上它们的确可以。 不要在数据库中存储string散列,并期望它们永远是一样的,因为它们不会。 所以String.GetHashcode()不应该用于这个。

为什么hashCode比类似的方法慢?

通常,Java会根据给定呼叫端遇到的实现数量来优化虚拟呼叫。 在我的基准testing 结果中可以很容易地看到,当你看看myCode ,这是一个简单的方法返回存储的int 。 有一个微不足道的 static abstract class Base { abstract int myCode(); } 与一些相同的实现类似 static class A extends Base { @Override int myCode() { return n; } @Override public int hashCode() { return n; } private final int n = nextInt(); } 随着实现数量的增加,方法调用的时间从两个实现的0.4 ns到1.2 ns增长到了11.6 ns,然后增长缓慢。 当JVM看到多个实现时,即preload=true ,时序会略有不同(因为需要testing的instanceof )。 到目前为止,清楚的是, hashCode行为有点不同。 特别是在三种情况下,速度要慢8-10倍。 任何想法为什么? […]

哈希映射和空值?

你如何将空值传入HashMap? 以下代码片段适用于填充选项: HashMap<String, String> options = new HashMap<String, String>(); options.put("name", "value"); Person person = sample.searchPerson(options); System.out.println(Person.getResult().get(o).get(Id)); 所以问题是什么必须input到选项和或方法来传递一个空值? 我尝试了下面的代码没有任何成功: options.put(null, null); Person person = sample.searchPerson(null); options.put(" ", " "); Person person = sample.searchPerson(null); options.put("name", " "); Person person = sample.searchPerson(null); options.put(); Person person = sample.searchPerson();

用C#中的SHA1algorithm散列

我想使用SHA1Managed使用SHA1algorithm散列给定的byte[]数组。 byte[]散列将来自unit testing。 预期的散列是0d71ee4472658cd5874c5578410a9d8611fc9aef (区分大小写)。 我怎样才能做到这一点? public string Hash(byte [] temp) { using (SHA1Managed sha1 = new SHA1Managed()) { } }

是否有可能在java中做比较器,但实现自定义equals()和hashCode()

我有一个对象的数组,我想连接它与另一个对象的数组,除了具有相同的ID的对象。 该对象在系统中的许多地方使用,没有哈希码或等于实现。 所以我不想实现hashCode()和equals(),因为我害怕在系统中某处使用那些对象,我不知道这些。 所以我想把所有的对象放在一个集合中,但不知何故使该对象使用自定义提供的hashCode()和equals()。 像自定义比较器(),但等于。

为什么String中的equals方法不使用散列?

String类中equals方法的代码是 public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n– != 0) { if (v1[i++] […]

hashCode()是如何在Java中计算的

在java中返回hashCode()方法的值是什么? 我读它是一个对象的内存引用…当我打印new Integer(1)散列值是1; 对于String("a")是97。 我很困惑:是ASCII还是什么types的值?

在Scala的case类中的hashCode

我读过Scala'a case class构造自动生成一个拟合equals和hashCode实现。 生成的代码是什么样的?

使用mod_rewrite将带有散列字符的path转换为查询string

我有一个PHP项目,我需要在URL的path中发送哈希字符(#)。 ( http://www.example.com/parameter#23/parameter#67/index.php )我以为urlencode会允许,将散列转换为%23 但是现在我看到,甚至urlencoded哈希都强制浏览器将所有东西都作为URL片段(或查询)来处理。 有没有办法通过一个哈希,或者我需要做urlencode之前的字符replace? 编辑添加(2017年9月19日): 原来我是在问错误的问题。 我的问题不是在path中使用散列字符(对其进行编码),而是使用mod_rewrite将其转换为查询string。 我没能在RewriteRule中重新编码它。 我将编辑标题以匹配。 这是我正在使用的重写规则: RewriteEngine On # convert path strings into query strings RewriteRule "^(.*)/(.*)/hashtags.php" /hashtags.php?parameter_1=$1&amp;parameter_2=$2 [QSA,L] 一旦我添加了B标签,它正常工作: RewriteEngine On # convert path strings into query strings RewriteRule "^(.*)/(.*)/hashtags.php" /hashtags.php?parameter_1=$1&amp;parameter_2=$2 [QSA,L,B]