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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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));

【讨论】:

以上是关于如何在 C# 中实现 sdbm 哈希函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在c ++中实现哈希映射?

Python 3.3 中的哈希函数在会话之间返回不同的结果

在 Swift 中实现哈希表?

发生冲突后在哈希表中实现链接时出现分段错误

在哪里可以找到在 ASP .NET MVC2 中实现密码恢复的 C# 示例代码

DS哈希查找与增补