2011-01-27 42 views
8

我创建了自己的GA库来构建一个跟踪像素的url,因为我需要在无cookie的环境中使用GA。但我坚持为cookie格式创建域哈希。构建谷歌分析域哈希

此cookie:

__utma=126394024.179004532335319200.1247654493.1260769004.1260878051.7 

第一段126394024显然是一个“域哈希”,而许多网站似乎表明它是如何使用的,我不能真正弄清楚如何从一个域产生的呢。这只能通过谷歌服务器上的一个内部流程来完成,而这个流程对世界其他国家来说是未知的吗?或者有没有一种方法可以让我自己散列这个域名来产生这个令牌?

+0

出于好奇,你用什么语言来建造它? – Yahel 2011-01-27 21:08:36

+0

Javascript。它将进入一个必须从file:// url工作的系统,该文件可悲地不支持cookies。 ga.js需要cookies。 – 2011-01-27 21:22:07

回答

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

这里是一个Java版本。这对任何需要Hive UDF的人都很有用。翻译的棘手部分是按位异或的运算符优先级,以及获取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); 
} 
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; 
}