【问题标题】:How would a sdbm hash function be implemented in C#?如何在 C# 中实现 sdbm 哈希函数?
【发布时间】:2010-09-06 04:02:53
【问题描述】:

如何在 C# 中实现sdbm 哈希函数(如this)?

【问题讨论】:

    标签: c# hash


    【解决方案1】:

    您几乎可以不加改动地获取 C 代码:

    uint sdbm( string str )
    {
        uint hash = 0;
        foreach( char ch in str )
        {
            hash = ch + (hash << 6) + (hash << 16) - hash;
        }
        return hash;
    }
    

    或者您是否想到了更复杂的东西?

    【讨论】:

      【解决方案2】:

      我没有设置 C 编译器,所以我无法测试它是否执行相同的操作,但我认为以下是正确的:

      private static ulong SBDM(string str)
      {
          ulong hash = 0;
      
          foreach (char c in str)
          {
              hash = c + (hash << 6) + (hash << 16) - hash;
          }
      
          return hash;
      }
      

      如果您只需要获取字符串的哈希值,而实现方式并不重要,您可以随时使用String.GetHashCode();

      【讨论】:

        【解决方案3】:

        散列的结果在 C++ 和 C# 实现之间有所不同。我发现 str 参数需要作为字节数组传递。

        private uint sdbm(byte[] str)
        {
            uint hash = 0;
        
            foreach (char ch in str)
                hash = ch + (hash << 6) + (hash << 16) - hash;
        
            return hash;
        }
        

        通过使用BitConverter.GetBytes 方法转换要散列的值来调用该方法。

        uint Hash = sdbm(BitConverter.GetBytes(myID));
        

        【讨论】:

          猜你喜欢
          • 2016-03-25
          • 2011-01-19
          • 2017-05-02
          • 1970-01-01
          • 2018-07-12
          • 2015-02-02
          • 1970-01-01
          • 2020-02-16
          • 2012-05-27
          相关资源
          最近更新 更多