28

「空でない」とは、この質問ではゼロ以外の文字を少なくとも 1 つ含む文字列を意味します。

参考までに、hashCode実装は次のとおりです。

1493    public int hashCode() {
1494        int h = hash;
1495        if (h == 0) {
1496            int off = offset;
1497            char val[] = value;
1498            int len = count;
1499
1500            for (int i = 0; i < len; i++) {
1501                h = 31*h + val[off++];
1502            }
1503            hash = h;
1504        }
1505        return h;
1506    }

アルゴリズムはドキュメントで指定されています。

整数オーバーフローが発生する前の答えは簡単です。ノーです。しかし、私が知りたいのは、整数のオーバーフローが原因で、空でない文字列のハッシュコードがゼロになる可能性があるかどうかです。構築できますか?

私が探しているのは、理想的には数学的デモンストレーション (またはデモンストレーションへのリンク) または構築アルゴリズムです。

4

3 に答える 3

2

気をつけてint h;ください。オーバーフローする可能性があり、満たすすべての文字列がh % 2^31 == 0これにつながる可能性があります。

public class HelloWorld {
    public static void main(String []args) {
       System.out.println("\u0001!qbygvW".hashCode());
        System.out.println("9 $Ql(0".hashCode());
        System.out.println(" #t(}lrl".hashCode());
        System.out.println(" !!#jbw}a".hashCode());
        System.out.println(" !!#jbw|||".hashCode());
        System.out.println(" !!!!Se|aaJ".hashCode());
        System.out.println(" !!!!\"xurlls".hashCode());
    }
}

糸がたくさん…

于 2018-04-27T06:01:54.840 に答える