近来想学习函数式编程。

但是一直不知道怎么展开这个学习过程,目前的研究进度也不深入,想讲解一些原理也无从下手。

先简单的上一些算法,逐步分析语法和思想。虽然程度不深,但至少能记录这个过程。

本例子用F#编写,是一种强类型,非纯函数式编程语言,在.net平台上运行,实际上为了兼容.net平台,你可以使用各种.net的基本类型和库。

C#的测试结果,从结果上看没有问题。

F#源码

 namespace Heron.Helpers

 open System.Text
open System.Security.Cryptography module Encrypt =
let Sha1Hash (str : string) =
let sha1 = SHA1.Create ()
let sha1arr = sha1.ComputeHash (Encoding.UTF8.GetBytes (str))
let sha1str = String.concat "" (Array.init (fun i -> sprintf "%02x" sha1arr.[i]))
sha1str let Md5Hash (str : string) =
let md5 = MD5.Create ()
let md5arr = md5.ComputeHash (Encoding.UTF8.GetBytes (str))
let md5str = String.concat "" (Array.init (fun i -> sprintf "%02x" md5arr.[i]))
md5str

短短数行就完成,是不是很简洁呢。

namespace Heron.Helpers

open System.Text
open System.Security.Cryptography /// 这段不用多说,namespace和C#中的功能一样,声明命名空间。
/// open相当于using ,导入一个命名空间
module Encrypt =
/// 这里的module是用来区分个模块功能的,对程序意义不大,在C#里被当作一个静态类处理兼容。F#是缩进敏感的语言,缩进比这段语句多一层的都属于这个模块下面的。所以下面的两个函数可以理解为这个模块的静态方法。
let Sha1Hash (str : string) =
let sha1 = SHA1.Create ()
let sha1arr = sha1.ComputeHash (Encoding.UTF8.GetBytes (str))
let sha1str = String.concat "" (Array.init (fun i -> sprintf "%02x" sha1arr.[i]))
sha1str /// let是用来绑定一个标识符,可以是实数,可以是字符串,可以是对象,也可以是函数,这里绑定的就是一个函数,带有一个string类型的参数str,最后一行为返回值,这里就是返回sha1str这个标识。实际上纯函数语言里是没有变量的,也没有基本类型,所有的东西都是函数,比如 let a = 0,你可以理解为没有参数,返回int的函数。F#为了兼容.net平台,类型都是静态绑定,靠自动推算来得到类型。
/// 这里用到的F#特性不多,只有第4行用到一点。可能看起来有点晕,我们来分解一下
Array.init (fun i -> sprintf "%02x" sha1arr.[i])
/// Array.init 这是一个函数,有两个参数,第一个表示返回的数组个数,第二个参数为一个匿名函数,就是括号里的内容(fun i -> sprintf "%02x" sha1arr.[i])。这个函数会迭代i 从0到19 刚好对应sha1arr的下标,然后一次转为16进制的数表示,不足的前面补零。
String.concat "" Array
/// 这个是把一个数组元素拼接为一个字符串的函数,第一个参数是拼接的符号,这里是空字符串,第二个参数是数组,就是上面生成的20个16进制的数。
/// 是不是代码简洁了很多呢

以后可能会陆续带来参数函数,返回值函数等高阶函数和泛型的随笔。不过我还是希望从实际数据着手,要有实际应用的空间。因为现在掌握的也不深,也没多少东西卖弄。

以后我会慢慢收集各种实用的算法,然后形成一个工具包,等实用度达到一定基础后会发布出来。不知道大家看好不。

如果大家有对函数编程的独特见解,也欢迎留言讨论。

加密算法 MD5/SHA1的更多相关文章

  1. JAVA自带的加密算法-MD5\SHA1\BASE64

    需要导入jar包: commons-codec.jar MD5 String str = "abc"; DigestUtils.md5Hex(str); SHA1 String s ...

  2. 加密算法比较3DES AES RSA ECC MD5 SHA1等

    加 密算法通常分为对称性加密算法和非对称性加密算法,对于对称性加密算法,信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行 加解密了.非对称算法与之不同,发送双方A,B事先均 ...

  3. php crc32,md5,sha1,mhash测试结果

    总结:php  自带hash mhash 用于散列只能加密   扩展mcrypt 用于加解密 对文件加密有的文件会隐藏换行,或者读取方式等影响导致结果不一致. 1.crc32 php: a.系统crc ...

  4. asp中的md5/sha1/sha256算法收集

    对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法: md5 (将以下代码另存为md5.inc) <% Private Const BITS_TO_A_B ...

  5. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

    1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...

  6. Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

    版权声明:本文为博主原创文章,未经博主允许不得转载. [前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及使用方法和例子 [最简单的加密] 1.简单的概念 明文:加密前的 ...

  7. MD5 SHA1 HMAC HMAC_SHA1区别

    MD5.SHA1.HMAC.HMAC_SHA1区别 引言     什么是MD5,什么是SHA1,如何校验这些Hash.还有拿单个apk文件的MD5,SHA1讯问是不是原版的问题,在这里,让我们先来了解 ...

  8. 基本的java加密算法MD5等等

    简单的java加密算法有: BASE64       严格地说,属于编码格式,而非加密算法 MD5             (Message Digest algorithm 5,信息摘要算法) SH ...

  9. MD5 SHA1 哈希 签名 碰撞 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. OpenGL模板 Mac Cmake OpenGL(Glut) Template

    自己经常使用的一些功能做一个模板,有灯光效果,你可以用鼠标放大,围绕所述旋转坐标系的原点 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHlhbmcxOT ...

  2. Saiku一个简短的引论

    一个简短的引论 Saiku成立于2008年,通过Tom Barber和Paul Stoellberger研究. 最初叫Pentaho分析工具.最初是基于OLAP4J图书馆的使用GWT采用前端分析工具包 ...

  3. react.js 从零开始(三)JSX 语法及特点介绍

    什么是jsx? jsx = JavaScript + xml jsx 是一种 Ecmascript 的一种新标准. jsx 是一种 带有结构性的语法. jsx 的特点: 1.类xml语法易于理解. 2 ...

  4. (一)AngularJS获取贴纸Hello World

    一旦项目使用JQuery原创javascript,最近参加了一个项目,需要使用AngularJS.RequireJS比较框架,如汰渍. 这里写一些博客,记录自己的学习过程,虽然冠以原来的名字,资料,加 ...

  5. A hard puzzle 1097

    Problem Description lcy gives a hard puzzle to feng5166,lwg,JGShining and Ignatius: gave a and b,how ...

  6. jquery动态刷新局部表单

    想实现一个效果就是选择某个年份:然后再action中按该年份查找数据库中的数据,返回到页面表单中显示. 1.添加登记年度的changge事件,也是异步请求. $(document).ready(fun ...

  7. 霍夫曼(最优二叉树)和Java达到

    一.定义 一些定义: 节点之间的路径长度:在从节点树中的一个节点也经历分公司,这构成的两个节点之间的路径分支的数目后这就是所谓的路径长度 的路径长度:从树的根节点到树中每一结点的路径长度之和. 在结点 ...

  8. crawler_x-requested-with 请求头

    在分析微博热点话题时  拿到异步请求后,有个关键参数 x-request-with 不携带不给正确响应 在服务器端判断request来自Ajax请求(异步)还是传统请求(同步): 两种请求在请求的He ...

  9. 高性能网络server--I/O复 select poll epoll_wait之间的差

    一个.select 方式作为收集,最多只能监控1024描述叙事断裂的文件,内部使用位操作,相应的位置1或设置0,必须是可读.可写.三类除单独的事件,内部查询方法.将全部的套接字从内核到用户空间之间进行 ...

  10. hdu 4915 Parenthese sequence(模拟)2014多培训学校5现场

    Parenthese sequence                                                                     Time Limit: ...