2013-04-09 33 views
1

我需要设计一种方法为存储在我的应用程序中的每个文档提供哈希。使用Google App Engine生成哈希代码(GAE)

使用现有的散列库(BCrypt等),甚至BSON ObjectId生成很好的“散列”或“密钥”,但它很长。

我也明白,实现短散列的唯一方法是散列较少的字符串(如果没有错误的话)。喜欢散列Long id的盯着0, 1, 2, 3等等。

但是很容易想到,在Google App Engine(GAE)数据存储库中实现它相当困难,或者到现在为止我还没有真正跨过这个需求。

跨服务器甚至跨数据中心和自动增量ID的GAE Datastore存储实体并不是真的这样。

实现此目标的策略是什么?

+0

1.某些散列库如md5和sha1将始终产生相同的长度 2.为什么要短散列? – marcadian 2013-04-09 19:46:47

+0

如果GAE数据存储擅长ID自动增量,那么MD5就可以了 – 2013-04-09 20:25:45

+0

你错了。消息摘要算法将任意长度的字节数组作为输入,并返回一个固定长度的字节数组作为输出(通常大约16或20个字节) – 2013-04-10 21:14:56

回答

2

据我所知,您正在寻找一种方法为您的文档生成简短的,唯一的字母数字标识符。网址缩写所做的事情(请参阅问题Making a short URL similar to TinyURL.comWhat's the best way to create a short hash, similiar to what tiny Url does?How to make unique short URL with Python?等)。我的回答是基于这个假设。

数据存储生成唯一的自动递增的ID,因此您可以依赖该数据存储。多个数据中心不是问题,您的ID将是唯一的,很短(至少在初始阶段),并且不存在冲突。这可能是小事和类似的服务实现它。

你甚至可以要求一个或多个唯一ID你坚持下去之前,你的新文档中的数据存储使用DatastoreService.allocateIds(),例如:

KeyRange keyRange = dataService.allocateIds("MyDocumentModel", 1); 
long uniqueId = keyRange.getStart().getId(); 

然后,您可以“散列”这个ID,或者你可以得到一个通过简单地将整数ID代码转换为Base64(或Base36或其他您定义自己的字符的基地,例如省略元音可以帮助您避免意外地生成明显的发誓词),甚至可以缩短字母数字ID。

如果可预测性是一个问题,您可以用一些随机字符来前缀/后缀这个字母数字标识。

+0

是的,这正是我实际尝试做的。但是,当你说自动增量?你是说在使用JDO或Objectify时?因为创建原始实体需要放置一个+键组合 – xybrek 2013-04-11 14:27:04

+0

例如'AdminDatastoreService.allocateIds(“MyKind”,5)''给出'MyKind'模型的数据存储生成的接下来的5个唯一键。这些键里面有唯一的整数ID。 – zengabor 2013-04-11 14:34:06

+0

对不起,这里是正确的链接:https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreService#allocateIds%28java.lang.String,%20long% 29 – zengabor 2013-04-11 14:45:22