Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将字符串散列到随机访问文件_Java_File_Hash - Fatal编程技术网

Java 如何将字符串散列到随机访问文件

Java 如何将字符串散列到随机访问文件,java,file,hash,Java,File,Hash,我很难理解老师希望我们如何做这个项目的第二部分。第一部分很容易找到员工并将其放入r.a.f,但我不明白如何将ssn(一个字符串)散列。有人能解释一下吗。为了以防万一,我把方向记下来了。谢谢 ssn:String9个字符, 全名:50个字符的字符串, 工资:浮动工资,以及 年龄:整数 1.程序写入至少20名员工,并将其顺序存储在随机访问上,然后以可读格式顺序读取和打印所有员工 2.重做上一部分假设员工是基于对ssn进行非顺序散列存储的您可以创建几乎任何类型的散列。如果我理解正确的话,我们希望使用一

我很难理解老师希望我们如何做这个项目的第二部分。第一部分很容易找到员工并将其放入r.a.f,但我不明白如何将ssn(一个字符串)散列。有人能解释一下吗。为了以防万一,我把方向记下来了。谢谢

ssn:String9个字符, 全名:50个字符的字符串, 工资:浮动工资,以及 年龄:整数

1.程序写入至少20名员工,并将其顺序存储在随机访问上,然后以可读格式顺序读取和打印所有员工


2.重做上一部分假设员工是基于对ssn进行非顺序散列存储的

您可以创建几乎任何类型的散列。如果我理解正确的话,我们希望使用一个不同的数据值,一个SSN,来生成一个散列,用于键入一些随机访问存储

我的第一个想法是,如果您需要一个基于字符串本身的强散列,则将SSN封装在一个类中,并使用它存储和获取SSN值,以及提供基于一个或多个字段以及种子的哈希代码实现。这在Block的有效Java中有一点描述,其中引入了HashCodeUtil类


这里讨论了一个工作示例:

在我看来,您正在尝试使用RandomAccessFile实现自己的哈希表。如果这是真的,那么您需要做的就是获取一个哈希代码并将其转换为插槽号。为此,将SSN字符串的hashcode除以接近表中预期条目数两倍的素数。你的情况可能是41岁。RandomAccessFile中的每个插槽都是一个条目的大小。在你的例子中,9+50+4+4=67。将插槽号乘以条目大小,以获得RandomAccessFile中要读取和写入的位置的偏移量


请注意,与所有哈希表一样,这可能会导致冲突。然后,一个真实世界的实现将处理某种类型的条目链接。

除非我遗漏了什么,否则你会打电话说实话,看起来我不必这么做,从你的解释来看,我不能只对字符串进行散列,用散列存储它吗?但是我如何使用普通的ssn字符串来搜索它呢?您所需要做的就是将字符串作为键传递给hash.put方法。java将把该字符串转换为哈希代码。当你想把它拿出来时,hash.get这个字符串会再次被转换成一个代码,然后它会按照我的想法@Totora来查找你的值。这会起作用,但不能完全满足步骤2中所述的要求,至少对于某些解释来说是这样。另外,通常不建议使用具有智能的密钥,特别是因为您特别提到了随机访问存储。这太接近于将SSN用作满足我口味的主键。但是,对于这种情况,信息隐藏可能太多了;很公平。虽然,数据契约可能会改变,而且一旦你完全投入到直接使用SSN中,如果你以后改变它,很难不产生连锁反应……我认为他不想让我们制作一个哈希表,似乎我已经让它工作了。我给他发了一封电子邮件,问他是否想要一个哈希表,但现在我只是对ssn进行哈希处理并存储它,为了重新获取信息,我通过控制台输入ssn并对其进行哈希处理,然后在文件中搜索该哈希。