当前位置: 首页 > 知识库问答 >
问题:

将从字符串派生的唯一数字转换为良好的哈希代码

岳晟
2023-03-14

我有一个应用程序,需要非常快速地比较许多小字符串。幸运的是,我可以保证以下所有字符串:

  • 每个字符串中只有前6个字符被认为是重要的;任何剩余字符的差异都将被忽略
  • 比较不区分大小写
  • 字符串中只允许(英文)字母字符“-”和“'”。

我突然想到,因此可以将每个字符串转换为一个可以直接与其他字符串生成的其他int进行比较的int,从而将潜在成本高昂的字符串比较转换为单周期整数比较。

然而,我还需要将这些字符串用作哈希表中的键(特别是Java的HashMap和HashSet类),我想知道我生成的数字是否可以用作好的哈希代码,或者是否可以轻松地转换为它们,或者是否还应该使用更传统的字符串哈希算法为我的对象生成哈希代码。我可以自己做一个性能测试,但我突然想到,这个确切的问题很可能是以前有人评估过的;我只是在努力寻找关于它的好信息。

我的唯一编号生成代码如下:

private int stringMatcherCode (String word)
{
    int total = 0;
    for (int i = 0; i < word.length() && i < 6; i ++)
    {
        char ch = word.charAt (i);
        if (ch == '-') ch = (char)28;  // does not contain the same last 5 bits as any letter
        if (ch == '\'') ch = (char)29; // nor this
        total = (total << 5) | (ch & 0x1F);
    }
    return total;
}

共有1个答案

满伟彦
2023-03-14

当我提出这个问题时,我所没有的关键洞察是Java的HashMap实现使用了两个大小表的功能(我假设它是按照我多年前所学的方式工作的,在这种方式中,表的大小保持为素数)。在我的实现中,只有前面的字符在选择任何给定字符串映射到的bucket时才有意义。因此,质数是乘法器的更好选择——然而,31对我来说并不好,因为我可以像使用32一样轻松地保证唯一性。然而,33确实起作用,因为33^6仍然

private int stringMatcherCode (String word)
{
    int total = 0;
    for (int i = 0; i < word.length() && i < 6; i ++)
    {
        char ch = word.charAt (i);
        if (ch == '-') ch = (char)28;  // does not contain the same last 5 bits as any letter
        if (ch == '\'') ch = (char)29; // nor this
        total = (total * 33) + (ch & 0x1F);
    }
    return total;
}
 类似资料:
  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引文来回答。 我有一个习惯,就是在程序之间将整数转换成字符串,改变要操作的变量类型并将其更改回来以获得整数结果,这是一个好的做法吗?这会如何影响时间复杂性(请注意,我对数据结构不熟悉)

  • 我对将纯java Curve25519函数转换为Python等效函数存在问题,具体问题与将哈希字符串转换为字节等效函数的摘要函数有关,java实现: 数据示例: sP=“这是一个用于测试目的的密码短语示例” 生成此字节输出: 82, -57, 124, 58, -105, 76, 123, 3, 119, -21, 121, 71, -54, 73, -75, 54, 31, -33, -49,

  • 问题内容: 我在系列中有一个类别变量。我想为每个唯一值分配整数ID,并使用ID创建一个新的系列,从而有效地将字符串变量转换为整数变量。最紧凑/最有效的方法是什么? 问题答案: 您可以使用pandas.factorize:

  • 最近,我参加了一次面试,遇到了一个关于哈希碰撞的很好的问题。 问题:给出一个字符串列表,把字谜一起打印出来。 示例: I/P: 、 、 、 、 、 、 、 、 、 、 、 、 {行为,上帝,动物,狗,猫} O/P:               演戏,猫,狗,上帝 我要创建hashmap并将单词作为键,将值作为字母表列表 为了避免冲突,我想为字母表生成唯一的哈希代码,而不是排序并使用排序后的单词作为

  • 行是我构造字符串并将其转换为byte[]以转换为SHA-256散列的地方,其中tmpSessionId是我从HTTP请求中获取的值。产生的散列将在以后的请求中发送。

  • 问题内容: 我是Java编程的新手。我创建了一个包含我的键值对的哈希映射,可用于将用户输入替换为对应于各个键的值。 即 我在公式评估中使用它 注意 :为用户提供了特定公式的特定输入方式(值1 +值2 +值3) 我正在使用(value1 value2 value3)并将其转换为(value1key value2key value3key) 更新: 我现在更好地理解该问题旨在帮助更好地了解如何利用哈希