我正在创建自己的GA库来自己构建跟踪像素的网址,因为我需要在无cookie的环境中使用GA。但我仍然坚持为cookie格式创建域哈希。
在这个cookie中:
__utma=126394024.179004532335319200.1247654493.1260769004.1260878051.7
第一个分段126394024
显然是一个“域哈希”,虽然许多网站似乎都展示了它的使用方式,但我实际上无法弄清楚如何从域中生成它。这只是由谷歌服务器上的内部流程完成的,这是世界其他地方所不知道的吗?或者有没有办法让我自己散列域名来生成这个令牌?
答案 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;
}