string生成固定长度的哈希_哈希函数简述

哈希函数是区块链技术不可或缺的一部分,可用于多种用途。 它是一种数学函数,它接受任何给定长度的输入并产生固定长度的输出。 输出通常称为哈希值,(哈希)摘要或哈希。

有很多哈希函数,就像多个在线的“计算器”。 计算器允许您同时使用不同种类的算法对您喜欢的任何输入进行哈希运算。 输入的大小可以从单个数字到整个文件,但输出的大小将始终相同。

加密哈希函数必须满足以下一组标准才能在区块链中使用:

单向性- 必须很容易计算给定输入的输出,但不可能计算给定输出的输入。 当我们在本章后面讨论加密货币挖掘时,这将是一个不可或缺的部分。

伪随机- 输入的变化将在输出中产生不可预见的变化。 如果输入“2”的散列值是“4”,则输入“3”的散列最好不是6。

抗冲突- 找到哈希函数的两个输入导致相同的输出应该很难(不能读取)。

确定性- 相同的输入总是需要产生相同的输出。

310a4c63e65fa7e5a96412a48e7b8cc8.png

目前最常用的哈希算法是SHA-256。 SHA是Secure Hash Algorithm的首字母缩写。该数字表示以比特为单位的输出长度,例如SHA系列中有四种不同的输出长度:224,256,384或512位。与区块链技术相关的另一种算法是RIPEMD系列。 RIPEMD160经常用于许多加密货币中,因为您可能已经猜到产生160位的输出。

哈希值在加密货币和区块链中用于多种用途。最显着的用途是将块链接在一起,从而创建区块链。我们将哈希值称为数据指纹,因为它具有抗冲突性。如果您要将文件发送给其他人,则可以在发送文件之前对文件进行哈希处理时包含哈希摘要。收件人可以在收到文件后计算文件的哈希值,并将其与您提供的哈希值进行比较,以便检查文件的完整性。

输入的每组数据可以通过它生成的唯一哈希轻松识别。找到哈希函数的两个输入几乎是不可能的,这会导致相同的输出(导致冲突)。地球上的所有超级计算机需要数千年的时间才能产生冲突。这是因为没有办法“计算”冲突。找到一个的唯一方法是通过蛮力方法,在那里你尝试不同的输入,直到你偶然发生冲突。

总结

哈希函数是区块链技术的第一个基石。文件的哈希就像指纹。通过比较它们的哈希值很容易检测两个文件是否相同。哈希将“区块”连结在一起。如果不包含前一个块的哈希,则无法更改过去的数据。如果您尝试更改数据,引用或链接将不可行。

关于Horizen,一个为资金、信息、媒体而打造。一个安全且隐私的平台。

在Hadoop中,按访问次数排序通常涉及MapReduce编程模型。以下是各函数的代码含义: 1. **Mapper类**: - **map()方法**:负责将输入数据转换为键值对。对于按访问次数排序,输入数据通常是日志文件或其他记录访问次数的文件。map()方法将每一行数据解析为一个键值对,其中键是访问的URL,值是访问次数。 ```java public class AccessCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private Text url = new Text(); private final static IntWritable one = new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] tokens = line.split("\\s+"); url.set(tokens[0]); // 假设URL是第一个字段 context.write(url, one); } } ``` 2. **Reducer类**: - **reduce()方法**:负责将相同键的值进行汇总。对于按访问次数排序,reduce()方法将相同URL的访问次数进行累加。 ```java public class AccessCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable totalCount = new IntWritable(); @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } totalCount.set(sum); context.write(key, totalCount); } } ``` 3. **Partitioner类**: - **getPartition()方法**:用于将中间键值对分配到不同的Reducer。默认情况下,Hadoop使用HashPartitioner,它根据键的哈希值进行分区。 ```java public class AccessCountPartitioner extends Partitioner<Text, IntWritable> { @Override public int getPartition(Text key, IntWritable value, int numPartitions) { return (key.hashCode() & Integer.MAX_VALUE) % numPartitions; } } ``` 4. **Driver类**: - **main()方法**:配置和启动MapReduce作业。设置Mapper、Reducer、Partitioner、输入输出路径等。 ```java public class AccessCountDriver { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "Access Count"); job.setJarByClass(AccessCountDriver.class); job.setMapperClass(AccessCountMapper.class); job.setReducerClass(AccessCountReducer.class); job.setPartitionerClass(AccessCountPartitioner.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 这些代码片段展示了如何使用Hadoop的MapReduce框架来实现按访问次数排序的功能。通过自定义Mapper、Reducer和Partitioner,可以灵活地处理和汇总数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值