1

bigint unsignedmysqlデータ型 ( )の範囲内の値を持つ文字列から整数へのハッシュ関数を探しています0 <= n <= 18446744073709551615。md5/sha1 を基数 16 の整数に変換することは、この要件に適合しません。

4

1 に答える 1

0

Javaはあなたのために働くはずのローリングハッシュを使用します

からjava.lang.String:

public int hashCode() {
    int h = hash;
    if (h == 0 && count > 0) {
        int off = offset;
        char val[] = value;
        int len = count;

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

アイデアは、ハッシュを次のように計算することです。

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

オーバーフローに対処するために、ハッシュをチェックするステップを追加できます。18446744073709551615それが大きい場合はmod、ハッシュと の を取得し18446744073709551615ます。

于 2013-07-22T08:28:12.067 に答える