• Home
  • About
    • Shadow Knight photo

      Shadow Knight

      https://live.bilibili.com/9565678

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

goland-hash散列查询代码

15 May 2018

Reading time ~2 minutes

hash散列原理查询 包路径自己改 main文件导入其余两个go文件

MyHashMap.go文件

package HashMap

import (
	"Project/5-15/homework/LinkNodes"
	"fmt"
)

var bultArr [16]*LinkNodes.Node
//为16个node循环添加头文件
func CreateBulet()  {
	var arr  = [16]*LinkNodes.Node{}
	for i := 0; i < 16; i++ {
		arr[i]=LinkNodes.CreateHeadNode("头结点","sdfsdf")


	}
  bultArr=arr
}

//将key 转换成数值下标的散列算法

func HashCode(key string) int {
	var index int =0
	index =int (key[0])
	for k := 0; k < len(key); k++ {
		index *=(1103515245 +int(key[k]))


	}
	index >>=27
	index &=16 -1
	return index
}
//向数组中添加键值对
func AddKeyValue(k string,v string)  {
//使用hash散列算法求字符串k在0-16区间中的所属值赋给pos
	var pos  = HashCode(k)
//将下标为pos的节点取出赋给head
	var head = bultArr[pos]
//将 head节点添加到指定下标节点的末尾
	LinkNodes.AddNode(k,v,head)


}
//获取数据
func GetValueByKey(k string) string {
	//使用hash散列算法求字符串k在0-16区间中的所属值赋给pos
	var pos = HashCode(k)
	//将下标为pos的节点取出赋给head
	var head = bultArr[pos]
	//通过头节点便利链表
	//LinkNodes.ShowNodes(head)
	//查找对应下标下的链表,判断在key与节点中的key一直时打印
	for {
		if head.Data.K == k {
			fmt.Println(head.Data.V)
			break
		} else {
			head = head.NextNode
			if head.NextNode == nil {

			}
		}
	}

	return ""
}



Node.go文件

package LinkNodes

import "fmt"

type DM struct {
	K string
	V string

}
//头结点
var head *Node
//最后一个节点
var curr *Node

//声明节点类型
type Node struct {
	//数据域
	Data DM
	//地址域
	NextNode *Node
}
//创建头结点
func CreateHeadNode(k string, v string) *Node {
	//声明结构图new 为指针类型
	var node =new(Node)
//设置头结点数据域的信息
	node.Data.K=k
	node.Data.V=v
	//设置地址域
	node.NextNode=nil
//保存头结点
	head=node

	curr=node

	return node
}
//在指定的节点后面添加新节点
func AddNode(k string, v string, curr *Node) *Node {
	var newNode = new(Node)
	//设置新节点中的数据域
	newNode.Data.K=k
	newNode.Data.V=v

	//设置地址域
	newNode.NextNode=nil
	//挂接新节点
	//将当前节点中的下一个节点设置为新建的节点
	curr.NextNode=newNode
	//设置最后一个节点为新新建节点
	curr=newNode
	//返回值新建节点
	return newNode
}
//在指定的节点后边遍历链表
func ShowNodes(n *Node)  {
	var node  =n
	for {
//如果当前node的下一个node为nil输出
并推出循环
		if node.NextNode==nil {
			fmt.Print(node.Data)
			break
//输出当前节点的值并把下一个节点付给当前的node
		}else {
			fmt.Println(node.Data)
			node=node.NextNode
		}
	}

}
//计算节点的个数
func NodeCnt() int {
	var cnt int = 1
	var node = head
	for {
		if node.NextNode == nil {
			break
		} else {
			node = node.NextNode
			cnt = cnt + 1
		}

	}
	return cnt
}

main.go文件

// MyHashMap project main.go
package main

import
(   "fmt"
	"Project/5-15/MyHashMap/HashMp"
)

func main() {
	fmt.Println("Hello World!")

	//测试HashMp包下的散列因子是否平均分布
	//fmt.Print(HashMp.HashCode("abc"))


    HashMp.CreateBulet()

	HashMp.AddKeyValue("abc", "hello")
	HashMp.AddKeyValue("bcd", "world")
	HashMp.AddKeyValue("asd", "12")
	HashMp.AddKeyValue("bsafqcd", "wor32ld")
	HashMp.AddKeyValue("bsddfcd", "wo21rld")
	HashMp.AddKeyValue("bcsdd", "worl3d")
	HashMp.AddKeyValue("basxdcd", "123")
	HashMp.GetValueByKey("bsafqcd")
}



golandhash Share Tweet +1