如何从哈希计算数组索引

时间:2015-10-08 13:46:16

标签: java hash

我已经看过如何为字符串创建哈希的示例。这是Java中的一个例子:

private int getHashCode(String text) {
    int hash = 7;
    for (int i = 0; i < text.length(); i++) {
        hash = hash * 31 + text.charAt(i);
    }

    return hash;
}

这当然可以产生大量数字。如果我将我的字符串存储在一个数组中,并且我只说了10个数组项,那么如何从哈希码中计算数组索引?我当然可以使用HashMap来做这件事,但我想这样做是为了学习如何从哈希码创建索引。

2 个答案:

答案 0 :(得分:4)

您可以使用余数运算符(int index = obj.getHashCode ("SomeString") % yourArray.length; )将哈希代码映射到数组的索引:

HashMap

当然,您应该能够处理冲突(即两个或多个Strings映射到同一个数组索引的情况)。

%通过在数组的每个索引中存储一个条目实例来处理这种潜在的冲突,该条目实例可以指向映射到同一索引的下一个条目(从而形成一个链表)。

编辑:

正如下面正确评论的那样,int index = Math.floorMod (obj.getHashCode ("SomeString"), yourArray.length); 运算符不适用于负哈希码。作为替代方案,您可以使用Math.floorMod(在Java 8中引入):

HashMap

无论哈希码的符号如何,都可以保证返回非负索引。

或者您可以采用obj.getHashCode ("SomeString") & (yourArray.length - 1)实施中使用的替代方案。如果数组的长度始终为2的幂,则可以使用 function cover_upload($afbeelding) { // path where the picture needs to be uploaded echo $album_path = APPPATH . 'images/covers'; // configuration for the upload $ext = end(explode(".", $_FILES['userfile']['name'])); $config = array( 'file_name' => $afbeelding . '.' . $ext, 'upload_path' => $album_path, 'allowed_types' => 'gif|jpg|jpeg|png', 'max_size' => '5120' ); // load upload library with the configuration $this->load->library('upload', $config); // upload picture with the upload library if (!$this->upload->do_upload()) { echo $this->upload->display_errors(); die(); } // get data array of the uploaded picture $image_data = $this->upload->data(); // configuration for the picture thumbnail resize echo $image_data['full_path']; $config = array( 'source_image' => $image_data['full_path'], 'new_image' => realpath($album_path . '/thumb'), 'maintain_ration' => TRUE, 'width' => 300, 'height' => 300 ); // load image manupulation library with the configuration $this->load->library('image_lib', $config); // resize picture $this->image_lib->resize(); $this->image_lib->clear(); // submit file name of the uploaded picture to save it in the database $bestandsnaam = $image_data['file_name']; return $bestandsnaam; }

答案 1 :(得分:1)

来自Java hashmap实现

n->数组大小

index = hashCode(key) & (n-1).