我用这个函数来计算哈希值:
.when('/product', {
templateUrl: 'views/product.html',
controller: 'ProductController',
title: ''
})
.when('/product/new', {
templateUrl: 'views/product_new.html',
controller: 'ProductController',
title: ''
})
.when('/product/:productId', {
templateUrl: 'views/product_detail.html',
controller: 'ProductDetailController',
title: ''
})
但现在我几乎没有问题:
哈希函数应该为任何类型的字符串创建修复输出长度。(无论我的输入长度是4还是10000,输出总是有固定大小)不是吗?但是当我的输入长度改变时,输出长度也会改变!!我想我的哈希函数不起作用。
如果我想将结果保存在数据库中,我的哈希值字段类型应该是什么?
Web应用程序中通常使用哪一个哈希函数?
答案 0 :(得分:4)
目前,您只是返回连接在一起的所有字节的十进制表示。所以{0,0,0}最终为“000”,而{123,123,123}最终为“123123123”。所以,是的,这两个哈希值都会为任何输入提供相同的输出大小(SHA-1将提供20个字节; MD5将提供16个字节),但您的字符串表示形式目前的长度会有所不同。
我建议使用十六进制表示法或base64 - 特别是,base64需要更少的工作:
public string GetSHA1(string input)
{
byte[] data = Encoding.UTF8.GetBytes(input);
using (SHA512 shaM = new SHA512Managed())
{
byte[] result = shaM.ComputeHash(data);
return Convert.ToBase64String(result);
}
}
Hex具有代表哈希的更常见方式的优点。 (Base64更常用于传输任意二进制数据,例如图像。)对于hex,您可以使用:
return BitConverter.ToString(result).Replace("-", "");
(请注意,我已声明本地变量 - 您似乎正在使用data
和result
的字段,这很糟糕想法 - 调用这些方法不应该影响实例的状态,IMO。)
或者,您可以返回byte[]
并将其作为blob直接存储在数据库中。使用base64或hex可能更简单 - 以这种方式检查数据更容易,并且坦率地更容易查询。字符串处理起来更简单:)
就你应该使用哪个哈希而言 - 我可能不会使用SHA-1或MD5,除非我不得不这样做;我默认使用SHA-256,虽然这取决于你想要做什么。例如,如果这是散列密码,您可能需要某个描述的HMAC - 或者更好的是,不要自己滚动,并使用现成的身份验证包。
答案 1 :(得分:2)
答案 2 :(得分:1)
通常的做法是使用ToBase64String()将哈希码的字节数组转换为base64编码 这也是密码的存储方式。给定固定数量的字节,base64编码是一个固定长度的字符串。每3个字节需要4个字符,加上一些填充