So erhalten Sie Google PageRank (PR) in Java

So erhalten Sie Google PageRank (PR) in Java

google pagerank

In diesem Beispiel zeigen wir Ihnen, wie Sie Google PageRank (PR) in Java erhalten. Um einen PageRank für "example.com" anzufordern, müssen Sie nur die folgende HTTP-Anfrage senden:

http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&ch=6236440745
&ie=UTF-8&oe=UTF-8&features=Rank&q=info:example.com

P.S Above URL is used by Google toolbar plugin.

Der knifflige Teil ist folgender Hashwert:

ch=6236440745

Google verwendet den Bob Jenkins-Hashing-Algorithmus [1] [2], um die URL zu hashen und einen Wert über "ch" zu generieren.

1. PageRank (PR) + Java Beispiel

Holen Sie sich Google PR für die Website "example.com".

GoogleSeoHelper.java

package com.example;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import com.example.hash.JenkinsHash;

public class GoogleSeoHelper {

  public static void main(String[] args) {

    GoogleSeoHelper obj = new GoogleSeoHelper();
    System.out.println(obj.getPR("example.com"));

  }

  public int getPR(String domain) {

    String result = "";

    JenkinsHash jenkinsHash = new JenkinsHash();
    long hash = jenkinsHash.hash(("info:" + domain).getBytes());

    //Append a 6 in front of the hashing value.
    String url = "http://toolbarqueries.google.com/tbr?client=navclient-auto&hl=en&"
       + "ch=6" + hash + "&ie=UTF-8&oe=UTF-8&features=Rank&q=info:" + domain;

    System.out.println("Sending request to : " + url);

    try {
        URLConnection conn = new URL(url).openConnection();

        BufferedReader br = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));

        String input;
        while ((input = br.readLine()) != null) {

            // What Google returned? Example : Rank_1:1:9, PR = 9
            System.out.println(input);

            result = input.substring(input.lastIndexOf(":") + 1);
        }

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

    if ("".equals(result)) {
        return 0;
    } else {
        return Integer.valueOf(result);
    }

  }

}

Ausgabe - Die URL "example.com" hat einen PageRank von 5!

Sending request to : http://toolbarqueries.google.com/tbr?client=navclient-auto
&hl=en&ch=6236440745&ie=UTF-8&oe=UTF-8&features=Rank&q=info:example.com
Rank_1:1:5
5

2. Jenkins perfekter Hashing-Algorithmus

Hier ist das Jenkins-Hash-Java-Port-Beispiel.

JenkinsHash.java

package com.example.hash;

/**
 * Hash algorithm by Bob Jenkins, 1996.
 *
 * You may use this code any way you wish, private, educational, or commercial.
 * It's free. See: http://burtleburtle.net/bob/hash/doobs.html
 *
 */
public class JenkinsHash {

    // max value to limit it to 4 bytes
    private static final long MAX_VALUE = 0xFFFFFFFFL;

    // internal variables used in the various calculations
    long a;
    long b;
    long c;

    /**
     * Convert a byte into a long value without making it negative.
     */
    private long byteToLong(byte b) {
        long val = b & 0x7F;
        if ((b & 0x80) != 0) {
            val += 128;
        }
        return val;
    }

    /**
     * Do addition and turn into 4 bytes.
     */
    private long add(long val, long add) {
        return (val + add) & MAX_VALUE;
    }

    /**
     * Do subtraction and turn into 4 bytes.
     */
    private long subtract(long val, long subtract) {
        return (val - subtract) & MAX_VALUE;
    }

    /**
     * Left shift val by shift bits and turn in 4 bytes.
     */
    private long xor(long val, long xor) {
        return (val ^ xor) & MAX_VALUE;
    }

    /**
     * Left shift val by shift bits. Cut down to 4 bytes.
     */
    private long leftShift(long val, int shift) {
        return (val << shift) & MAX_VALUE;
    }

    /**
     * Convert 4 bytes from the buffer at offset into a long value.
     */
    private long fourByteToLong(byte[] bytes, int offset) {
        return (byteToLong(bytes[offset + 0])
        + (byteToLong(bytes[offset + 1]) << 8)
        + (byteToLong(bytes[offset + 2]) << 16) + (byteToLong(bytes[offset + 3]) << 24));
    }

    /**
     * Mix up the values in the hash function.
     */
    private void hashMix() {
        a = subtract(a, b);
        a = subtract(a, c);
        a = xor(a, c >> 13);
        b = subtract(b, c);
        b = subtract(b, a);
        b = xor(b, leftShift(a, 8));
        c = subtract(c, a);
        c = subtract(c, b);
        c = xor(c, (b >> 13));
        a = subtract(a, b);
        a = subtract(a, c);
        a = xor(a, (c >> 12));
        b = subtract(b, c);
        b = subtract(b, a);
        b = xor(b, leftShift(a, 16));
        c = subtract(c, a);
        c = subtract(c, b);
        c = xor(c, (b >> 5));
        a = subtract(a, b);
        a = subtract(a, c);
        a = xor(a, (c >> 3));
        b = subtract(b, c);
        b = subtract(b, a);
        b = xor(b, leftShift(a, 10));
        c = subtract(c, a);
        c = subtract(c, b);
        c = xor(c, (b >> 15));
    }

    /**
     * Hash a variable-length key into a 32-bit value. Every bit of the key
     * affects every bit of the return value. Every 1-bit and 2-bit delta
     * achieves avalanche. The best hash table sizes are powers of 2.
     *
     * @param buffer
     *            Byte array that we are hashing on.
     * @param initialValue
     *            Initial value of the hash if we are continuing from a previous
     *            run. 0 if none.
     * @return Hash value for the buffer.
     */
    public long hash(byte[] buffer, long initialValue) {
        int len, pos;

        // set up the internal state
        // the golden ratio; an arbitrary value
        a = 0x09e3779b9L;
        // the golden ratio; an arbitrary value
        b = 0x09e3779b9L;
        // the previous hash value

        //c = initialValue;
        c = 0x0E6359A60L;

        // handle most of the key
        pos = 0;
        for (len = buffer.length; len >= 12; len -= 12) {
            a = add(a, fourByteToLong(buffer, pos));
            b = add(b, fourByteToLong(buffer, pos + 4));
            c = add(c, fourByteToLong(buffer, pos + 8));
            hashMix();
            pos += 12;
        }

        c += buffer.length;

        // all the case statements fall through to the next on purpose
        switch (len) {
        case 11:
            c = add(c, leftShift(byteToLong(buffer[pos + 10]), 24));
        case 10:
            c = add(c, leftShift(byteToLong(buffer[pos + 9]), 16));
        case 9:
            c = add(c, leftShift(byteToLong(buffer[pos + 8]), 8));
            // the first byte of c is reserved for the length
        case 8:
            b = add(b, leftShift(byteToLong(buffer[pos + 7]), 24));
        case 7:
            b = add(b, leftShift(byteToLong(buffer[pos + 6]), 16));
        case 6:
            b = add(b, leftShift(byteToLong(buffer[pos + 5]), 8));
        case 5:
            b = add(b, byteToLong(buffer[pos + 4]));
        case 4:
            a = add(a, leftShift(byteToLong(buffer[pos + 3]), 24));
        case 3:
            a = add(a, leftShift(byteToLong(buffer[pos + 2]), 16));
        case 2:
            a = add(a, leftShift(byteToLong(buffer[pos + 1]), 8));
        case 1:
            a = add(a, byteToLong(buffer[pos + 0]));
            // case 0: nothing left to add
        }
        hashMix();

        return c;
    }

    /**
     * See hash(byte[] buffer, long initialValue)
     *
     * @param buffer
     *            Byte array that we are hashing on.
     * @return Hash value for the buffer.
     */
    public long hash(byte[] buffer) {
        return hash(buffer, 0);
    }
}