代码之家  ›  专栏  ›  技术社区  ›  Jeffrey Hines

将任意字符串转换为值为1到26的1个字符哈希

c#
  •  0
  • Jeffrey Hines  · 技术社区  · 14 年前

    我需要一个算法将任意长度的字符串散列为1到26之间的值。

    我意识到我可以对每个字符的值进行求和,然后做一个mod 26+1,但是我想也许有人会有一个更有效的方法来做这个。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Mehrdad Afshari    14 年前

    您是否需要使哈希值在应用程序的不同运行中不发生变化?如果您不想在内存中使用它,只需使用提供的系统 GetHashCode 功能:

    (s.GetHashCode() % 26) +  1
    

    将字符串映射为介于1和26之间(含1和26)的整数。当然,这并不真正适用于像持久化数据库这样的任务。

        2
  •  0
  •   Eric J.    14 年前

    模和增量运算符非常有效。这可能对几乎所有的目的都有效。

    您确定了具体的性能问题吗?如果是,情况如何?

    将哈希代码作为其他海报建议的模数基础,与单个字符的ascii/unicode值相加相比,在统计上会使值的分布更加均匀。散列操作也相当快,尽管可能比求和每个位置的值慢一点点。

        3
  •  0
  •   Michael Hardy    14 年前

    您建议的解决方案似乎很好,只要您使用的方法匹配字符串来均匀散列,并且字符串中的一个小变化应该在散列中创建一个相当大的变化。