8 votes

Construire un hachage de domaine google analytics

Je suis en train de créer ma propre bibliothèque GA pour construire moi-même une url vers le pixel de suivi puisque je dois utiliser GA dans un environnement sans cookie. Mais je suis bloqué sur la création du hachage du domaine pour le format du cookie.

Dans ce biscuit :

__utma=126394024.179004532335319200.1247654493.1260769004.1260878051.7

Le premier segment 126394024 est apparemment un "hachage de domaine", et bien que de nombreux sites semblent montrer comment il est utilisé, je n'arrive pas à trouver comment le générer à partir d'un domaine. Est-ce que cela se fait uniquement par un processus interne sur les serveurs de Google qui est inconnu du reste du monde ? Ou existe-t-il un moyen de hacher moi-même le nom de domaine pour produire ce jeton ?

11voto

brian_d Points 6783

Est-ce que ça marche ?
http://www.google.com/support/forum/p/Google+Analytics/thread?tid=626b0e277aaedc3c&hl=fr

function hash(d){
var a=1,c=0,h,o;
if(d){
a=0;
for(h=d["length"]-1;h>=0;h--){
o=d.charCodeAt(h);
a=(a<<6&268435455)+o+(o<<14);
c=a&266338304;
a=c!=0?a^c>>21:a
}
}
return a
}

Je ne l'ai pas vérifié moi-même

3voto

Nico Westerdale Points 345

Version C# de ce qui précède, si quelqu'un le souhaite :

    string hash(string d)
    {
        int a = 1;
        int c = 0;
        int h;
        int o;
        if (!String.IsNullOrEmpty(d))
        {
            a = 0;
            for (h = d.Length - 1; h >= 0; h--)
            {
                o = d[h];
                a = (a << 6 & 268435455) + o + (o << 14);
                c = a & 266338304;
                a = c != 0 ? a ^ c >> 21 : a;
            }
        }
        return a.ToString();
    }

1voto

George Carrette Points 41

Voici une version Java. Cela pourrait être utile à quiconque a besoin d'un UDF Hive. Les parties délicates de la traduction sont la précédence de l'opérateur xor au niveau du bit, et la technique d'accès à l'Unicode. La définition de la classe a été laissée de côté dans l'intérêt de la brièveté.

import java.util.List;
import java.util.ArrayList;

static int domain_hash(String s) {
    List<Integer> d = get_string_charCodes(s);
    int a=0,c=0,h,o;
    if (d.size() == 0) {
        return(1);
    }
    for(h = d.size()-1; h >= 0; h--) {
        o = d.get(h);
        a = ((a << 6) & 268435455) + o + (o << 14);
        c = a & 266338304;
        if (c != 0) {
            a = a^(c>>21);
        }
    }
    return(a);
}

static List<Integer> get_string_charCodes(String s) {
    List<Integer> l = new ArrayList<Integer>();
    int length = s.length(), codepoint, offset;
    for(offset = 0; offset < length; offset += Character.charCount(codepoint)) {
        codepoint = s.codePointAt(offset);
        l.add(codepoint);
    }
    return(l);
}

0voto

GreatBlakes Points 425

Un peu tard, mais je ne l'ai pas trouvé ailleurs, alors pour ce que ça vaut, voici une version PHP. Elle fonctionne pour moi, donc j'espère qu'elle est à la hauteur pour les autres.

function hash($d){
    $a = 1;
    $c = 0;     
    if ( $d ){
        $a = 0;
        for ( $h = strlen($d)-1; $h >= 0; $h-- ){
            $o = ord($d[$h]);
            $a = (($a<<6)&268435455)+$o+($o<<14);
            $c = $a&266338304;
            $a = ( $c != 0 )? $a^($c>>21) : $a;
        }
    }
    return $a;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X