当前位置: 首页 > 面试题库 >

使用哈希码获取唯一ID

濮宇定
2023-03-14
问题内容

我在一个基于Java的系统中工作,我需要为视觉显示中的某些元素设置一个ID。一类元素是字符串,因此我决定使用String.hashCode()方法来获取这些元素的唯一标识符。

但是,我遇到的问题是,如果id为负,并且String.hashCode经常返回负值,那么我正在borks中工作的系统。一种快速的解决方案是仅在哈希码调用周围使用Math.abs()来确保得到肯定的结果。我想知道这种方法是,两个不同的元素具有相同的哈希码的机会是什么?

例如,如果一个字符串返回的哈希码为-10,而另一个字符串返回的哈希码为10,则将发生错误。在我的系统中,我们所谈论的对象集合通常不超过30个元素,因此我不认为这确实是一个问题,但我对数学的含义感到好奇。


问题答案:

哈希码可以看作是伪随机数。从统计int上讲,当总体大小约为54K(对于 任何, 则为77K
int)时,使用正的哈希码,任何两个元素之间发生冲突的机会都将达到50%。有关各种哈希码大小的冲突概率,请参见生日问题概率表。

另外,您Math.abs()单独使用的想法有缺陷:它并不总是返回正数!在2的补码算术中,的绝对值Integer.MIN_VALUE本身就是!众所周知,的哈希码"polygenelubricants"就是这个值。



 类似资料:
  • 问题内容: 我对HashMap有一个奇怪的问题。 有多个线程访问同一哈希图(不是线程安全的)。 有时,过程陷入困境。 当我检查线程堆栈时,我看到许多线程处于状态: 请注意,这种情况很少发生。并且不能按需复制。 为什么会卡住? 哈希图上没有同步。 键是字符串 问题答案: 有多个线程访问同一哈希图(不是线程安全的)。 听起来好像您在 没有 适当同步的线程环境中使用它。您遇到的问题是内存已损坏,因此线程

  • 我正在使用BCryptPasswordEncoder使用spring security。现在对于更改密码,我需要做的是比较用户提供的现有密码和DB值。 但是由于salt是由动态生成的,所以每次我从下面的方法得到不同的散列值,并且不一定会与我的DB值匹配。 解决这个问题的办法是什么?我能识别用于我的DB字段的盐并在上面的方法中使用相同的盐吗?

  • 嗨,我想知道如果你有你要寻找的对象的Hashcode,是否可以直接访问HashSet的内容,有点像在HashMap中使用Hashcode作为键。 我想它可能会像这样工作: 谢谢 编辑:谢谢你的回答。好的,我知道我可能会稍微推动HashSet的契约,但是对于这个特定的项目,等式完全由hashcode决定,我确信每个hashcode/hashbucket只有一个对象。我非常不愿意使用HashMap的原

  • 每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。 在存储密码前正确的 哈希密码 是非常重要的。密码的哈希操作是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号

  • 我在Spring和Redis上都很新。我想知道有没有办法按价值得到钥匙? 例如,我希望获得具有给定文件哈希和内容的图像类型文件的get the KEY。我是这样做的: 然而,我被告知这是相当昂贵的,因为我要获得所有以“image”开头的键,并手动检查所有这些键。 现在我在想,也许如果我能按价值得到钥匙会好得多。以便更容易得到它的所有属性。在Redis可能吗?

  • hget key field 获取指定的hash field hmget key filed1....fieldN 获取全部指定的hash filed hmset key filed1 value1 ... filedN valueN 同时设置hash的多个field