|
||||
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 }
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |