热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Go从入门到精通系列视频之go编程语言密码学哈希算法(二)






 2.1 哈希算法的代码实现 


2.1.1 核心代码


下面列举一些基础工具函数,如例13-1所示。


例1-1 基础工具函数


1 package main


2 import (


3  "encoding/hex"


4  "fmt"


5 )


6 func main(){


7  arr := []byte{'1', '0', '0', '0','p', 'h', 'o' ,'n', 'e'}


8  fmt.Println(string(arr))


9  str :=BytesToHexString(arr)


10  fmt.Println(str)


11  str = ReverseHexString(str)


12  arr,_ = HexStringToBytes(str)


13  fmt.Printf("%x\n", arr)


14  ReverseBytes(arr)


15  fmt.Println(string(arr))


16 }


17 /**


18  * 将字节数组转成16进制字符串: []byte -> string


19  */


20 func BytesToHexString(arr []byte) string {


21    return hex.EncodeToString(arr)


22 }


23 /**


24  * 将16进制字符串转成字节数组: hex string ->  []byte


25  */


26 func HexStringToBytes(s string) ([]byte, error) {


27    arr, err := hex.DecodeString(s)


28    return arr, err


29 }


30 /**


31  * 16进制字符串大端和小端颠倒


32  */


33 func ReverseHexString(hexStr string) string {


34    arr, _ := hex.DecodeString(hexStr)


35    ReverseBytes(arr)


36    return hex.EncodeToString(arr)


37 }


38 /**


39  * 字节数组大端和小端颠倒


40  */


41 func ReverseBytes(data []byte) {


42    for i, j := 0, len(data)-1; i

43       data[i], data[j] = data[j], data[i]


44    }


45 }


运行结果如图所示。


 Go从入门到精通系列视频之go编程语言密码学哈希算法(二)


图1.1 运行结果


 


下面列举一些哈希函数的使用,如例13-2所示。


例1-2 哈希函数


1 package main


2 import (


3  "crypto/md5"


4  "crypto/sha1"


5  "crypto/sha256"


6  "crypto/sha512"


7  "encoding/hex"


8  "fmt"


9  "hash"


10 )


11 func main(){


12  str := "1000phone"


13  fmt.Println(str)


14  str1 := HASH(str, "md5", false)


15  fmt.Println(str1)


16  str2 := HASH(str, "sha1", false)


17  fmt.Println(str2)


18  str3 := HASH(str, "sha256", false)


19  fmt.Println(str3)


20  arr := SHA256Double(str, false)


21  fmt.Println(string(arr))


22  str4 := SHA256DoubleString(str, false)


23  fmt.Println(str4)


24 }


25 func HASH(text string, hashType string, isHex bool) string {


26  var hashInstance hash.Hash


27  switch hashType {


28  case "md5":


29  hashInstance = md5.New()


30  case "sha1":


31  hashInstance = sha1.New()


32  case "sha256":


33  hashInstance = sha256.New()


34  case "sha512":


35  hashInstance = sha512.New()


36  }


37  if isHex {


38  arr , _ := hex.DecodeString(text)


39  hashInstance.Write(arr)


40  } else {


41  hashInstance.Write([]byte(text))


42  }


43  cipherBytes := hashInstance.Sum(nil)


44  return fmt.Sprintf("%x" , cipherBytes)


45 }


46 


47 func SHA256Double(text string, isHex bool) []byte {


48  hashInstance := sha256.New()


49  if isHex {


50  arr , _ := hex.DecodeString(text)


51  hashInstance.Write(arr)


52  } else {


53  hashInstance.Write([]byte(text))


54  }


55  cipherBytes := hashInstance.Sum(nil)


56  hashInstance.Reset()


57  hashInstance.Write(cipherBytes)


58  cipherBytes = hashInstance.Sum(nil)


59  return cipherBytes


60 }


61 


62 


63 func SHA256DoubleString(text string, isHex bool) string {


64  hashInstance := sha256.New()


65  if isHex {


66  arr , _ := hex.DecodeString(text)


67  hashInstance.Write(arr)


68  } else {


69  hashInstance.Write([]byte(text))


70  }


71  cipherBytes := hashInstance.Sum(nil)


72  hashInstance.Reset()


73  hashInstance.Write(cipherBytes)


74  cipherBytes = hashInstance.Sum(nil)


75  return fmt.Sprintf("%x" , cipherBytes)


76 }


运行结果如图所示。


Go从入门到精通系列视频之go编程语言密码学哈希算法(二)


图1.2 运行结果


 




推荐阅读
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • JSOI2010 蔬菜庆典:树结构中的无限大权值问题
    本文探讨了 JSOI2010 的蔬菜庆典问题,主要关注如何处理非根非叶子节点的无限大权值情况。通过分析根节点及其子树的特性,提出了有效的解决方案,并详细解释了算法的实现过程。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • Java 实现二维极点算法
    本文介绍了一种使用 Java 编程语言实现的二维极点算法。该算法用于从一组二维坐标中筛选出极点,适用于需要处理几何图形和空间数据的应用场景。文章不仅详细解释了算法的工作原理,还提供了完整的代码示例。 ... [详细]
  • 本文详细介绍了如何使用 PHP 接收并处理微信支付的回调结果,确保支付通知能够被正确接收和响应。 ... [详细]
  • 本文详细介绍了如何在PHP中删除数组中的指定元素、第一个元素和最后一个元素,并提供了具体的代码示例和相关函数的使用说明。 ... [详细]
  • 本文探讨了在Java中如何正确地将多个不同的数组插入到ArrayList中,避免所有数组在插入后变得相同的问题。我们将分析代码中的问题,并提供解决方案。 ... [详细]
author-avatar
土豆小妈姐_645
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有