RK算法全程Rabin-Karp,该算法的2位发明者Rabin和Karp的名字组合而成。该算法的核心思想就是通过比较2个字符串的hashcode来判断是否包含对方。
但是要注意发生hash冲突

public class Test {
    public static void main(String[] args) {
        String source = "abcdefghijklmn";
        String target = "efg";
        System.out.println(compireStr1(source, target));
    }

    /** 字符串的RK算法,求字串第一次出现的位置
     * @param source
     * @param target
     * @return
     */
    private static int compireStr1(String source, String target){
        //临界值
        if (StringUtils.isEmpty(source) || source.length() < target.length()  || StringUtils.isEmpty(target)){
            return -1;
        }
        //1、获取target的长度和hash值
        int hash = computeStrToHash(target);
        int len = target.length();
        //2、截取source等长的字符串
        StringBuilder str = new StringBuilder(source.substring(0, len));
        for (int i = len; i <= source.length(); i++) {
            String s = str.toString();
            //hash相等并且字符串也相等
            if (compireHashValue(hash,s) && s.equals(target)){
                return i-len;
            }
            //字符串删除第一位,往后移动一位,
            str = str.deleteCharAt(0).append(source.charAt(i));
        }
        return -1;
    }


    /**
     * 计算hash值
     * @param source
     * @return
     */
    private static int computeStrToHash(String source){
        int hash = 0;
        for (int i = 0; i < source.length(); i++) {
            hash += String.valueOf(source.charAt(i)).hashCode();
        }
        return hash;
    }

    /**
     * 判断字符串的hash值是否等于指定值
     * @param hashTotal
     * @param str
     * @return
     */
    private static boolean compireHashValue(int hashTotal, String str){
        return computeStrToHash(str) == hashTotal;
    }
}

时间复杂度O(n)
还有优化的地方,重复计算