Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  Licensed to the Apache Software Foundation (ASF) under one or more
0003  contributor license agreements.  See the NOTICE file distributed with
0004  this work for additional information regarding copyright ownership.
0005  The ASF licenses this file to You under the Apache License, Version 2.0
0006  (the "License"); you may not use this file except in compliance with
0007  the License.  You may obtain a copy of the License at
0008 
0009     http://www.apache.org/licenses/LICENSE-2.0
0010 
0011  Unless required by applicable law or agreed to in writing, software
0012  distributed under the License is distributed on an "AS IS" BASIS,
0013  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0014  See the License for the specific language governing permissions and
0015  limitations under the License.
0016 */
0017 
0018 /*
0019  * A C function for R extension which implements the Java String hash algorithm.
0020  * Refer to http://en.wikipedia.org/wiki/Java_hashCode%28%29#The_java.lang.String_hash_function
0021  *
0022  */
0023 
0024 #include <R.h>
0025 #include <Rinternals.h>
0026 
0027 /* for compatibility with R before 3.1 */
0028 #ifndef IS_SCALAR
0029 #define IS_SCALAR(x, type) (TYPEOF(x) == (type) && XLENGTH(x) == 1)
0030 #endif
0031 
0032 SEXP stringHashCode(SEXP string) {
0033   const char* str;
0034   R_xlen_t len, i;
0035   int hashCode = 0;
0036   
0037   if (!IS_SCALAR(string, STRSXP)) {
0038     error("invalid input");
0039   }
0040   
0041   str = CHAR(asChar(string));
0042   len = XLENGTH(asChar(string));
0043   
0044   for (i = 0; i < len; i++) {
0045     hashCode = (hashCode << 5) - hashCode + *str++;
0046   }
0047 
0048   return ScalarInteger(hashCode);
0049 }