Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 109 lines (89 sloc) 2.741 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace Enyim
{
/// <summary>
/// This is Jenkin's "One at A time Hash".
/// http://en.wikipedia.org/wiki/Jenkins_hash_function
///
/// Coming from libhashkit.
/// </summary>
/// <remarks>Does not support block based hashing.</remarks>
internal class HashkitOneAtATime : HashAlgorithm, IUIntHashAlgorithm
{
public HashkitOneAtATime()
{
this.HashSizeValue = 32;
}

public override bool CanTransformMultipleBlocks
{
get { return false; }
}

public override void Initialize() { }

protected override void HashCore(byte[] array, int ibStart, int cbSize)
{
if (array == null) throw new ArgumentNullException("array");
if (ibStart < 0 || ibStart > array.Length) throw new ArgumentOutOfRangeException("ibStart");
if (ibStart + cbSize > array.Length) throw new ArgumentOutOfRangeException("cbSize");

HashkitOneAtATime.UnsafeHashCore(array, ibStart, cbSize);
}

protected override byte[] HashFinal()
{
return BitConverter.GetBytes(this.CurrentHash);
}

public uint CurrentHash { get; private set; }

#region [ UnsafeHashCore ]

// see the murmur hash about stream support
private static unsafe uint UnsafeHashCore(byte[] data, int offset, int count)
{
uint hash = 0;

fixed (byte* start = &(data[offset]))
{
var ptr = start;

while (count > 0)
{
hash += *ptr;
hash += (hash << 10);
hash ^= (hash >> 6);

count--;
ptr++;
}
}

hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);

return hash;
}
#endregion
#region [ IUIntHash ]

uint IUIntHashAlgorithm.ComputeHash(byte[] data)
{
this.Initialize();

this.HashCore(data, 0, data.Length);

return this.CurrentHash;
}

#endregion
}
}

#region [ License information ]
/* ************************************************************
*
* Copyright (c) 2010 Attila Kiskó, enyim.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* ************************************************************/
#endregion
Something went wrong with that request. Please try again.