【发布时间】:2017-12-05 04:18:41
【问题描述】:
如何将 sh1 哈希的长度减少到 10 位以下?有可能吗?
我已尝试使用以下代码
/**
*
* @param id
* @return
*/
public static final String getGeneratedId(final String id) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(id);
oos.close();
MessageDigest m = MessageDigest.getInstance("SHA1");
m.update(baos.toByteArray());
return new BigInteger(1, m.digest()).toString(16);
} catch (Exception e) {
ICAMPPLogger.logException(CLASSNAME, "error in creating uuid" + e);
ICAMPPUtils.getStackTraceToString(e);
return BigInteger.ZERO.toString();
}
}
public static void main(String[] args) {
String token = getGeneratedId("testing");
System.out.println(token);
}
ouput is : 1305340859400297508806692338645894167742475232778
But i would like to limit length to less than 10 . is it posssible
【问题讨论】:
-
getGeneratedId("foobar").substring(0, 10)-- 非常简单。当然,这样做会增加碰撞的机会。 -
当您不创建
UUID时,谈论UUID也是一种误导。 -
而且您不应该使用 Java 序列化将字符串转换为字节数组。只需使用 string.getBytes(StandardCharsets.UTF8)。
-
@Erwin Bolwidt:子字符串.. 非常错误的事情。那么我怎样才能重新获得我从那个令牌中给出的字符串。这不是我的意思
-
@PRASANTHMV 根据定义,加密哈希不允许从哈希中取回原始文本。这就是哈希的全部原理。无论您是否采用它的子字符串都不会改变任何东西。
标签: java