热门标签 | 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 运行结果


 




推荐阅读
  • Java中字符串截取方法详解
    本文详细介绍了Java中常用的字符串截取方法及其应用场景,帮助开发者更好地理解和使用这些方法。 ... [详细]
  • protobuf 使用心得:解析与编码陷阱
    本文记录了一次在广告系统中使用protobuf进行数据交换时遇到的问题及其解决过程。通过这次经历,我们将探讨protobuf的特性和编码机制,帮助开发者避免类似的陷阱。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • 本文详细介绍了HashSet类,它是Set接口的一个实现,底层使用哈希表(实际上是HashMap实例)。HashSet不保证元素的迭代顺序,并且是非线程安全的。 ... [详细]
  • 近期尝试从www.hub.sciverse.com网站通过编程手段获取数据时遇到问题,起初尝试使用WebBrowser控件进行数据抓取,但发现使用GET方法翻页时,返回的HTML代码始终相同。进一步探究后了解到,该网站的数据是通过Ajax异步加载的,可通过HTTP查看详细的JSON响应。 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
  • 在将 Android Studio 从 3.0 升级到 3.1 版本后,遇到项目无法正常编译的问题,具体错误信息为:org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDemoProductDebugResources'。 ... [详细]
  • 本文详细介绍了如何在循环双链表的指定位置插入新元素的方法,包括必要的步骤和代码示例。 ... [详细]
  • 本文探讨了在使用JavaMail发送电子邮件时,抄送功能未能正常工作的问题,并提供了详细的代码示例和解决方法。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • IO流——字符流 BufferedReader / BufferedWriter 进行文件读写
    目录节点流、处理流读文件:BufferedReader的使用写文件:BufferedWriter的使用节点流处理流节点流和处理流的区别和联系字符流Buf ... [详细]
  • 本文探讨了如何在游戏启动画面中移除广告,特别是在游戏数据加载期间(大约5-6秒)广告会短暂显示的问题。通过调整XML布局和代码逻辑,可以实现广告的延迟加载或完全移除。 ... [详细]
  • MySQL Administrator: 监控与管理工具
    本文介绍了 MySQL Administrator 的主要功能,包括图形化监控 MySQL 服务器的实时状态、连接健康度、内存健康度以及如何创建自定义的健康图表。此外,还详细解释了状态变量和系统变量的管理。 ... [详细]
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社区 版权所有