ちょっと復習というか確認で 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