Java字符串的n位HashCode是什么?

4

我正在尝试在Java中从一个字符串获取一个ID,我认为可以使用哈希码(是的,两个字符串可以有相同的哈希码,但我可以接受这种小概率)。我想让这个ID最多只有4位数字。这可能吗?

这是字符串默认的hashCode实现:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

我可以覆盖它以生成一个只有4位数字的哈希值吗?


4
return h % 10000; 这行代码应该可以正常工作。 - Iłya Bursov
1
就像你可以用4位数字来表示任何数字一样。余数。 - Sid
1
当然,您可以@Override任何未被标记为final或private的继承方法。但是,将哈希码长度缩短到4位数字的含义是什么? - Nikolas Charalambidis
1
@IlyaBursov除了h可以为负数之外... - Holger
1
@shmosel 在取模运算后不能是最小值。 - Iłya Bursov
显示剩余7条评论
1个回答

1

一个简单的技巧是只取最后四位数字:

private static int myHash(String s) {
    return s.hashCode() % 10000;
}

编辑:
正如@Holger所评论的那样,hashCode()可能返回负值。如果要求返回一个四位数的正整数,则可以取绝对值:

private static int myHash(String s) {
    return Math.abs(s.hashCode() % 10000);
}

为什么要使用 static - Nikolas Charalambidis
5
@Nikolas 为什么不呢? - Mureinik
@Nikolas他的原因是为了回答这个问题 ;) 他并没有在任何生产代码中真正使用它。 - gtgaxiola
4
@尼古拉再次提问 - 为什么不这样做?您在此处未使用任何实例成员,因此为什么要不必要地将“this”指针压入堆栈中? - Mureinik
6
@Nikolas,原帖中的代码示例是一个实例方法,因为它是String.hashCode的JDK源代码(http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java#l1439)。由于`String`是一个final类,所以我们不涉及扩展和覆盖`hashCode`,即使在我们可以这样做的情况下,也不应该像这样重写`hashCode`,因为涉及到Liskov替换原则和一般的契约义务。请恕我直言,你的批评没有多少意义。像这样的实用方法通常是静态的。 - Radiodef
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接