我正在尝试通过在google.com上执行网络请求并SHA256对请求中的请求标头进行哈希处理来生成世界范围内的唯一哈希(或在发生碰撞时天文学上很少的机会)。
目的是在不使用系统的密码随机数生成器的情况下生成这些唯一的哈希。这样做的原因是这些散列没有用于安全性。
由此产生的哈希值在全球范围内真正具有多大可能性?
工作示例代码:
using System;
using System.Net;
using System.Security.Cryptography;
using System.Text;
class Program
{
static void Main(string[] args)
{
WebRequest request = WebRequest.Create("https://google.com");
request.Timeout = 1000;
try
{
WebHeaderCollection responseHeaders = request.GetResponse().Headers;
StringBuilder headerString = new StringBuilder();
for (int i = 0; i < responseHeaders.Count; i++)
headerString.Append(responseHeaders.Get(i));
Console.WriteLine(headerString.ToString());
byte[] hash = new SHA256Managed().ComputeHash(Encoding.UTF8.GetBytes(headerString.ToString()));
Console.WriteLine();
Console.WriteLine(Convert.ToBase64String(hash));
}
catch
{
Console.WriteLine("Time out or unable to perform request.");
}
}
}
答案 0 :(得分:2)
为什么不使用Guid? 重复的机会是天文数字:https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions
答案 1 :(得分:1)
目前尚不清楚为什么需要散列函数。对于给定的输入,需要一个哈希函数来产生相同的结果。但是,如果您有或多或少的随机输入(例如Google的输出),则似乎不需要散列,只需要一个唯一的数字即可。
对于唯一数字,我认为您的方法不是一个好主意。如果Google发送的标头只有一次相同,那么散列也将相同并且不再唯一。
据我所知,唯一使响应唯一的标头是date
标头。 (我没有在注释中提到计算机上的cookie标头)。它具有1秒的分辨率,因此您的实现将在一秒钟内为所有运行返回相同的哈希值。
此外,依赖Internet连接执行此类任务听起来有些过分。
通常会生成唯一标识符的操作(但这不是哈希值):使用网卡的MAC地址(应该已经是唯一的)并将其与当前时间(以毫秒为单位)组合起来。基本上就是Guid背后的想法。