想要:返回UInt16的C#哈希算法?

时间:2014-10-16 09:29:01

标签: c# .net algorithm hash

我需要一个哈希算法,它接受一个字符串并返回一个可以存储在UInt16中的数字。我需要它来计算一个小的校验和数。

.Net有这个算法吗?

3 个答案:

答案 0 :(得分:2)

也许您正在寻找crc16Here是一个使用byte[]作为输入的示例,也许您可​​以修改它来处理字符。


为下一个人添加了一些代码:
用法:ushort hash = Crc16.ComputeHash("Hello World!");

using System;

/// <summary>
/// Creates a checksum as a ushort / UInt16.
/// </summary>
public class Crc16
{
    const ushort polynomial = 0xA001;
    ushort[] table = new ushort[256];

    /// <summary>
    /// Initializes a new instance of the <see cref="Crc16"/> class.
    /// </summary>
    public Crc16()
    {
        ushort value;
        ushort temp;
        for (ushort i = 0; i < table.Length; ++i)
        {
            value = 0;
            temp = i;
            for (byte j = 0; j < 8; ++j)
            {
                if (((value ^ temp) & 0x0001) != 0)
                {
                    value = (ushort)((value >> 1) ^ polynomial);
                }
                else
                {
                    value >>= 1;
                }
                temp >>= 1;
            }
            table[i] = value;
        }
    }

    /// <summary>
    /// Computes the hash.
    /// </summary>
    /// <param name="input">The input.</param>
    /// <returns></returns>
    public static ushort ComputeHash(string input)
    {
        if(input == null)
        {
            input = "";
        }

        Crc16 crc = new Crc16();
        byte[] bytes = Encoding.UTF8.GetBytes(input);
        return crc.ComputeChecksum(bytes);
    }

    /// <summary>
    /// Computes the checksum.
    /// </summary>
    /// <param name="bytes">The bytes.</param>
    /// <returns>The checkum.</returns>
    public ushort ComputeChecksum(byte[] bytes)
    {
        ushort crc = 0;
        for (int i = 0; i < bytes.Length; ++i)
        {
            byte index = (byte)(crc ^ bytes[i]);
            crc = (ushort)((crc >> 8) ^ table[index]);
        }
        return crc;
    }

    /// <summary>
    /// Computes the checksum bytes.
    /// </summary>
    /// <param name="bytes">The bytes.</param>
    /// <returns>The checksum.</returns>
    public byte[] ComputeChecksumBytes(byte[] bytes)
    {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }
}

答案 1 :(得分:1)

好吧,我咬了一口:

int hash = "hello".GetHashCode();
ushort hash16 = (ushort) ((hash >> 16) ^ hash);

当然,如果你真的想要,你也可以编写自己的哈希,但这似乎很方便。

答案 2 :(得分:1)

  

.Net有这个算法吗?

请参阅hash functions以查看您要查找的内容。了解差异,选择适合您需求的差异,您的帖子非常“短”,我不能说太多。在任何情况下,我都不建议您采用32位算法的输出,而只需采用低16位,这是不错的选择。

您是否正在寻找CRC校验和,您在寻找正常的校验和吗?

无论哪种方式,选择你的选择,谷歌C# <the implementation name>,并根据你的需要进行修改。