ちょっと復習というか確認で Java の String.hashCode と同等のアルゴリズム

(define (hash-code str)
  (define (inner s r)
    (if (null? s)
        r
        (inner (cdr s) (+ (* 31 r)
                          (x->number (car s))))))
  (inner (string->list str) 0))

一応 OpenJDK 7 のコードを拾ってきたけど結果が違ってる...

public class S {
    public static long hashCode(String s) {
        long h = 0;
        if (h == 0 && s.length() > 0) {
            int off = 0;
            char val[] = s.toCharArray();
            int len = s.length();
            for (int i = 0; i < len; i++) {
                h = 31 * h + val[off++];
            }
        }
        return h;
    }

    public static void main(String[] argv) {
        System.out.println(hashCode(argv[0]));
    }
}

gosh で実行

gosh> (hash-code "abcdefghijklmnopqrstuvwxyzo")
1928429363426550786004236725069790471597

java で実行

$ javac S.java
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
$ java S abcdefghijklmnopqrstuvwxyz
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
7250214665611535789