using System;
using System.Runtime.ConstrainedExecution;
using System.Security.Cryptography;
using System.Text;
namespace CYQ.Data.Tool
{
/////
///// Fowler-Noll-Vo hash, variant 1, 32-bit version.
///// http://www.isthe.com/chongo/tech/comp/fnv/
/////
//internal class FNV1_32 : HashAlgorithm
//{
// private static readonly uint FNV_prime = 16777619;
// private static readonly uint offset_basis = 2166136261;
// protected uint hash;
// public FNV1_32()
// {
// HashSizeValue = 32;
// }
// public override void Initialize()
// {
// hash = offset_basis;
// }
// protected override void HashCore(byte[] array, int ibStart, int cbSize)
// {
// int length = ibStart + cbSize;
// for (int i = ibStart; i < length; i++)
// {
// hash = (hash * FNV_prime) ^ array[i];
// }
// }
// protected override byte[] HashFinal()
// {
// return BitConverter.GetBytes(hash);
// }
//}
/////
///// Fowler-Noll-Vo hash, variant 1a, 32-bit version.
///// http://www.isthe.com/chongo/tech/comp/fnv/
/////
//internal class FNV1a_32 : HashAlgorithm
//{
// private static readonly uint FNV_prime = 16777619;
// private static readonly uint offset_basis = 2166136261;
// protected uint hash;
// public FNV1a_32()
// {
// HashSizeValue = 32;
// }
// public override void Initialize()
// {
// hash = offset_basis;
// }
// protected override void HashCore(byte[] array, int ibStart, int cbSize)
// {
// int length = ibStart + cbSize;
// for (int i = ibStart; i < length; i++)
// {
// hash = (hash ^ array[i]) * FNV_prime;
// }
// }
// protected override byte[] HashFinal()
// {
// return BitConverter.GetBytes(hash);
// }
//}
/////
///// Modified Fowler-Noll-Vo hash, 32-bit version.
///// http://home.comcast.net/~bretm/hash/6.html
//// 这个坑货的算法,同一个key在不同的线程下,竟然偶尔会出来不同的hash。
/////
//internal class ModifiedFNV1_32 : FNV1_32
//{
// protected override byte[] HashFinal()
// {
// hash += hash << 13;
// hash ^= hash >> 7;
// hash += hash << 3;
// hash ^= hash >> 17;
// hash += hash << 5;
// return BitConverter.GetBytes(hash);
// }
//}
///
/// 创建唯一Hash。
///
internal class HashCreator
{
///
/// 创建HashKey,重复概率低一些。
///
///
public static string CreateKey(string key)
{
if (string.IsNullOrEmpty(key))
{
return "K" + CreateCode(key);
}
return "K" + (int)key[0] + CreateCode(key) + key.Length;
}
//private static readonly FNV1a_32 fnv1 = new FNV1a_32();//不受进程影响,但受cpu影响,所以不能用。
///
/// 创建HashCode,有一定重复概率。
///
///
///
public static uint CreateCode(string key)
{
if (key == null)
{
return uint.MinValue;
}
else if (key.Trim() == "")
{
return uint.MaxValue;
}
return GetHashCode(key);
//return BitConverter.ToUInt32(fnv1.ComputeHash(Encoding.Unicode.GetBytes(key)), 0);
}
///
/// 取自java的字符串hash算法(有一定重复的概率)。
///
///
///
private static uint GetHashCode(string value)
{
uint h = 0;
foreach (char c in value)
{
h = 31 * h + c;
}
return h;
}
//[System.Security.SecuritySafeCritical] // auto-generated
//[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
//private static uint GetHashCode(string key)
//{
// unsafe
// {
// fixed (char* src = key)
// {
// int hash1 = 5381;
// int hash2 = hash1;
// int c;
// char* s = src;
// while ((c = s[0]) != 0)
// {
// hash1 = ((hash1 << 5) + hash1) ^ c;
// c = s[1];
// if (c == 0)
// break;
// hash2 = ((hash2 << 5) + hash2) ^ c;
// s += 2;
// }
// return (uint)((long)(hash1 + hash2 * 1566083941) + int.MaxValue);
// }
// }
//}
}
}