根据url生成唯一的idkey,记录并分享:

    public class UrlToUniqueKey
{
private static Hashtable generators = new Hashtable();
public static long[,] polynomials = new long[, ]
{
{
0L,
0L
},
{
-4611686018427387904L,
-4611686018427387904L
},
{
-2305843009213693952L,
-2305843009213693952L
},
{
-3458764513820540928L,
-5764607523034234880L
},
{
-576460752303423488L,
-576460752303423488L
},
{
-1441151880758558720L,
-4899916394579099648L
},
{
-2738188573441261568L,
-5332261958806667264L
},
{
-1945555039024054272L,
-1945555039024054272L
},
{
-7602076171001397248L,
-3134505340649865216L
},
{
-9169328841326329856L,
-8628896886041870336L
},
{
-5719571526760529920L,
-1612288666598637568L
},
{
-2742692173068632064L,
-3913628076184961024L
},
{
-1776670052997660672L,
-2407174000829530112L
},
{
-2005227734086713344L,
-7718043861406187520L
},
{
-3112550292466434048L,
-5147051424131055616L
},
{
-2113595600120315904L,
-7045600142044430336L
},
{
-3682677857793867776L,
-7529033414544982016L
},
{
-2812286861060341760L,
-6211097204841512960L
},
{
-7338580408428134400L,
-181868019327172608L
},
{
-4070603152259284992L,
-7580349821236543488L
},
{
-4690912428278415360L,
-1656541810593366016L
},
{
-8730258663983284224L,
-1124153882377715712L
},
{
-7455702586042089472L,
-7995369281233616896L
},
{
-58297206016311296L,
-5584750510474264576L
},
{
-8198983991290757120L,
-6900195776585007104L
},
{
-3368309616348758016L,
-777578196575977472L
},
{
-7950798515817414656L,
-5274165001345564672L
},
{
-1814110279349305344L,
-3073563053254508544L
},
{
-7333090856108294144L,
-299958969764413440L
},
{
-5862047463258456064L,
-1088406921112715264L
},
{
-2699705949936943104L,
-6180435270106611712L
},
{
-5010893113942605824L,
-745326200523587584L
},
{
-7247248171544346624L,
-7637035222663430144L
},
{
-379617898928275456L,
-2128952956840574976L
},
{
-8982278211127738368L,
-8328970742175629312L
},
{
-2699136824088985600L,
-657743201922187264L
},
{
-5723859659287166976L,
-3191693334452109312L
},
{
-5937852116755283968L,
-8585462099679903744L
},
{
-4340513297460625408L,
-2535761738024878080L
},
{
-7223736098545991680L,
-5810321976182439936L
},
{
-8771886216598519808L,
-8198507976365965312L
},
{
-1991715210309664768L,
-3768584310714531840L
},
{
-9162551332419141632L,
-8616797614972600320L
},
{
-719027294788648960L,
-6649233720883544064L
},
{
-3559483092657242112L,
-7475962079365038080L
},
{
-713657193466691584L,
-3981624362359062528L
},
{
-2043424698022887424L,
-3853773324916752384L
},
{
-4041900042031005696L,
-2750302262364798976L
},
{
-4436928417950760960L,
-8365357674703716352L
},
{
-5903553087924551680L,
-232537924545363968L
},
{
-8728448178608234496L,
-4183444001187078144L
},
{
-2341229233224585216L,
-6731777037870903296L
},
{
-1649801635265304576L,
-2988673641163274240L
},
{
-7620924682850272256L,
-4999586984279010304L
},
{
-6766504171168936448L,
-3233736554084598272L
},
{
-4307058212505990400L,
-7352830162319492864L
},
{
-6559722688844616064L,
-3544821563555732608L
},
{
-5503660899170514624L,
-9177641346571454016L
},
{
-187437317177603296L,
-1362648669985435232L
},
{
-24562796859796592L,
-1298422235250900464L
},
{
-3825548837209328312L,
-4007863133653759080L
},
{
-5023278451590057620L,
-8135395730479815484L
},
{
-1370071926941500434L,
-7957612307809224958L
},
{
-2163743556238479977L,
-2346333074831914631L
},
{
-2935493925047926053L,
-7378668602973054136L
}
};
public static UrlToUniqueKey std64 = UrlToUniqueKey.make(UrlToUniqueKey.polynomials[, ], );
public static UrlToUniqueKey std32 = UrlToUniqueKey.make(UrlToUniqueKey.polynomials[, ], );
public static UrlToUniqueKey std40 = UrlToUniqueKey.make(UrlToUniqueKey.polynomials[, ], );
public static UrlToUniqueKey std24 = UrlToUniqueKey.make(UrlToUniqueKey.polynomials[, ], );
private long zero = 0L;
private long one = long.MinValue;
public long empty;
public int degree;
public long polynomial;
private long[,] ByteModTable; private UrlToUniqueKey(long polynomial, int degree)
{
this.degree = degree;
this.polynomial = polynomial;
this.ByteModTable = new long[, ];
long[] numArray = new long[];
long num1 = long.MinValue;
long num2 = this.rightMove(long.MinValue, degree - );
for (int index = ; index < ; ++index)
{
numArray[index] = num1;
bool flag = (num1 & num2) != 0L;
num1 = this.rightMove(num1, );
if (flag)
num1 ^= polynomial;
}
this.empty = numArray[];
for (int index1 = ; index1 < ; ++index1)
{
for (int index2 = ; index2 < ; ++index2)
{
long num3 = 0L;
for (int index3 = ; index3 < ; ++index3)
{
if ((index2 & << index3) != )
num3 ^= numArray[(int)sbyte.MaxValue - index1 * - index3];
}
this.ByteModTable[index1, index2] = num3;
}
}
} public static UrlToUniqueKey make(long polynomial, int degree)
{
long num = polynomial;
UrlToUniqueKey heritrix = (UrlToUniqueKey)UrlToUniqueKey.generators[(object)];
if (heritrix == null)
{
heritrix = new UrlToUniqueKey(polynomial, degree);
UrlToUniqueKey.generators.Add((object)num, (object)heritrix);
}
return heritrix;
} private long rightMove(long value, int pos)
{
if (pos != )
{
long num = long.MaxValue;
value >>= ;
value &= num;
value >>= pos - ;
}
return value;
} public static long long_rightMove(long value, int pos)
{
if (pos != )
{
long num = long.MaxValue;
value >>= ;
value &= num;
value >>= pos - ;
}
return value;
} private int int_rightMove(int value, int pos)
{
if (pos != )
{
int num = int.MaxValue;
value >>= ;
value &= num;
value >>= pos - ;
}
return value;
} public long reduce(long fp)
{
int num1 = - this.degree / ;
long num2 = num1 == ? 0L : fp & -1L << * num1;
long num3 = 0L;
for (int index = ; index < num1; ++index)
{
num3 ^= this.ByteModTable[ + index, (int)fp & (int)byte.MaxValue];
fp = this.rightMove(fp, );
}
return num2 ^ num3;
} public long extend_byte(long f, int v)
{
f ^= (long)((int)byte.MaxValue & v);
int num = (int)f;
return this.rightMove(f, ) ^ this.ByteModTable[, num & (int)byte.MaxValue];
} public long extend_char(long f, int v)
{
f ^= (long)((int)ushort.MaxValue & v);
int num = (int)f;
return this.rightMove(f, ) ^ this.ByteModTable[, num & (int)byte.MaxValue] ^ this.ByteModTable[, this.int_rightMove(num, ) & (int)byte.MaxValue];
} public long extend_int(long f, int v)
{
f ^= (long)uint.MaxValue & (long)v;
int num1 = (int)f;
long num2 = this.rightMove(f, ) ^ this.ByteModTable[, num1 & (int)byte.MaxValue];
int num3 = this.int_rightMove(num1, );
long num4 = num2 ^ this.ByteModTable[, num3 & (int)byte.MaxValue];
int num5 = this.int_rightMove(num3, );
return num4 ^ this.ByteModTable[, num5 & (int)byte.MaxValue] ^ this.ByteModTable[, this.int_rightMove(num5, ) & (int)byte.MaxValue];
} public long extend_long(long f, long v)
{
f ^= v;
long num1 = this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
long num2 = num1 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
long num3 = num2 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
long num4 = num3 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
long num5 = num4 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
long num6 = num5 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
long num7 = num6 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
f = this.rightMove(f, );
return num7 ^ this.ByteModTable[, (int)(f & (long)byte.MaxValue)];
} public long fp(byte[] buf, int start, int n)
{
return this.extend(this.empty, buf, start, n);
} public long fp(char[] buf, int start, int n)
{
return this.extend(this.empty, buf, start, n);
} public long fp(string s)
{
return this.extend(this.empty, s);
} public long fp(int[] buf, int start, int n)
{
return this.extend(this.empty, buf, start, n);
} public long fp(long[] buf, int start, int n)
{
return this.extend(this.empty, buf, start, n);
} public long fp8(string s)
{
return this.extend8(this.empty, s);
} public long fp8(char[] buf, int start, int n)
{
return this.extend8(this.empty, buf, start, n);
} public long extend(long f, byte v)
{
return this.reduce(this.extend_byte(f, (int)v));
} public long extend(long f, char v)
{
return this.reduce(this.extend_char(f, (int)v));
} public long extend(long f, int v)
{
return this.reduce(this.extend_int(f, v));
} public long extend(long f, long v)
{
return this.reduce(this.extend_long(f, v));
} public long extend(long f, byte[] buf, int start, int n)
{
for (int index = ; index < n; ++index)
f = this.extend_byte(f, (int)buf[start + index]);
return this.reduce(f);
} public long extend(long f, char[] buf, int start, int n)
{
for (int index = ; index < n; ++index)
f = this.extend_char(f, (int)buf[start + index]);
return this.reduce(f);
} public long extend(long f, string s)
{
int length = s.Length;
for (int index = ; index < length; ++index)
{
int v = (int)s[index];
f = this.extend_char(f, v);
}
return this.reduce(f);
} public long extend(long f, int[] buf, int start, int n)
{
for (int index = ; index < n; ++index)
f = this.extend_int(f, buf[start + index]);
return this.reduce(f);
} public long extend(long f, long[] buf, int start, int n)
{
for (int index = ; index < n; ++index)
f = this.extend_long(f, buf[start + index]);
return this.reduce(f);
} public long extend8(long f, string s)
{
int length = s.Length;
for (int index = ; index < length; ++index)
{
int v = (int)s[index];
f = this.extend_byte(f, v);
}
return this.reduce(f);
} public long extend8(long f, char[] buf, int start, int n)
{
for (int index = ; index < n; ++index)
f = this.extend_byte(f, (int)buf[start + index]);
return this.reduce(f);
} public static ulong createUrlkey(string url)
{
int length = url.IndexOf("://");
if (length > )
length = url.IndexOf('/', length + "://".Length);
string s = length == - ? url : url.Substring(, length);
return Convert.ToUInt64(Convert.ToString(UrlToUniqueKey.std32.fp(s) | UrlToUniqueKey.long_rightMove(UrlToUniqueKey.std40.fp(url), ), ).PadLeft(, ''), );
}
/// <summary>
/// 根据url生成唯一id
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static long createUrlToLong(string url)
{
int length = url.IndexOf("://");
if (length > )
length = url.IndexOf('/', length + "://".Length);
string s = length == - ? url : url.Substring(, length);
return UrlToUniqueKey.std32.fp(s) | UrlToUniqueKey.long_rightMove(UrlToUniqueKey.std40.fp(url), );
}
}

最新文章

  1. apache如何解决跨域资源访问
  2. android开机过程简单描述
  3. 多进程模块multiprocessing的使用
  4. nyoj 613 免费馅饼 广搜
  5. 【PHP对XML文件的操作技术【完整版】】
  6. MySQL Cluster 集群
  7. nginx不支持pathinfo 导致thinkphp出错解决办法
  8. ASP.NET内置对象二
  9. [转]JSON序列化与反序列化
  10. DataGridView 选中行 分类: DataGridView 2015-01-22 09:07 51人阅读 评论(0) 收藏
  11. BitBlt介绍
  12. cocoapods在OS X Yosemite系统中报错
  13. wordpress在window下完美实现301重定向的方法
  14. S3C2440的SPI解析
  15. jQuery的选择器中的通配符[id^=&#39;code&#39;]或[name^=&#39;code&#39;]及jquery选择器总结
  16. Dijskstra算法
  17. Linux mail 查看
  18. 【RabbitMQ】5、RabbitMQ任务分发机制
  19. BZOJ 4806 - 4809 象棋四题
  20. Spring Security原理与应用

热门文章

  1. socket初步
  2. ecmall 2.3.0 最新补丁20140618
  3. PHP远程连接mysql
  4. MEF学习总结(3)---Attribute Model Programing
  5. nginx statistics in multi-workers
  6. 将h264和aac码流合成flv文件
  7. PAT 甲级1003 Emergency (25)(25 分)(Dikjstra,也可以自己到自己!)
  8. Java中static关键字介绍
  9. java之IO整理(中)
  10. thinkjs 学习笔记