构建谷歌分析域哈希

时间:2011-01-27 20:42:34

标签: google-analytics

我正在创建自己的GA库来自己构建跟踪像素的网址,因为我需要在无cookie的环境中使用GA。但我仍然坚持为cookie格式创建域哈希。

在这个cookie中:

__utma=126394024.179004532335319200.1247654493.1260769004.1260878051.7

第一个分段126394024显然是一个“域哈希”,虽然许多网站似乎都展示了它的使用方式,但我实际上无法弄清楚如何从域中生成它。这只是由谷歌服务器上的内部流程完成的,这是世界其他地方所不知道的吗?或者有没有办法让我自己散列域名来生成这个令牌?

4 个答案:

答案 0 :(得分:11)

这有用吗?
http://www.google.com/support/forum/p/Google+Analytics/thread?tid=626b0e277aaedc3c&hl=en

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
}

我自己没有验证

答案 1 :(得分:3)

如果有人想要的话,

以上的C#版本:

    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();
    }

答案 2 :(得分:1)

这是一个Java版本。这对于需要Hive UDF的人来说非常有用。翻译的棘手部分是按位xor的运算符优先级,以及获取Unicode的技术。 为了简洁起见,省略了类定义。

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);
}

答案 3 :(得分:0)

有点晚,但我无法在其他地方找到它,所以它的价值在于它的PHP版本。它对我有用,所以希望它可以吸引别人。

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;
}