以下问题比最初看起来更复杂.
假设我有一个任意的JSON对象,可能包含任何数量的数据,包括其他嵌套的JSON对象.我想要的是JSON数据的加密哈希/摘要,而不考虑实际的JSON格式本身(例如:忽略换行符和JSON令牌之间的间距差异).
最后一部分是一项要求,因为JSON将由许多不同平台上的各种(de)序列化程序生成/读取.我知道至少有一个Java的JSON库在反序列化期间读取数据时完全删除了格式.因此,它将打破哈希.
上面的任意数据子句也使事情变得复杂,因为它阻止我以给定顺序获取已知字段并在哈希之前连接它们(大致考虑Java的非加密hashCode()方法是如何工作的).
最后,将整个JSON字符串散列为一块字节(在反序列化之前)也是不可取的,因为在计算散列时应该忽略JSON中的字段.
我不确定这个问题有一个很好的解决方案,但我欢迎任何方法或想法=)
过去几周我一直在尝试使用guava的MapMaker找到理想的缓存实现.请在此处和此处查看我之前的两个问题,以了解我的思考过程.
根据我所学到的,我的下一次尝试将放弃软值,转而使用maximumSize和expireAfterAccess:
ConcurrentMap<String, MyObject> cache = new MapMaker()
.maximumSize(MAXIMUM_SIZE)
.expireAfterAccess(MINUTES_TO_EXPIRY, TimeUnit.MINUTES)
.makeComputingMap(loadFunction);
Run Code Online (Sandbox Code Playgroud)
哪里
Function<String, MyObject> loadFunction = new Function<String, MyObject>() {
@Override
public MyObject apply(String uidKey) {
return getFromDataBase(uidKey);
}
};
Run Code Online (Sandbox Code Playgroud)
但是,我仍在努力解决的另一个问题是,即使它们的时间很长,这个实现也会驱逐对象,即使它们是强烈可达的.这可能会导致多个对象在环境中浮动相同的UID,这是我不想要的(我相信我想要实现的目标称为规范化).
所以,据我所知,唯一的答案是有一个额外的映射作为一个interner我可以检查,看看数据对象是否仍在内存中:
ConcurrentMap<String, MyObject> interner = new MapMaker()
.weakValues()
.makeMap();
Run Code Online (Sandbox Code Playgroud)
并且将修改加载函数:
Function<String, MyObject> loadFunction = new Function<String, MyObject>() {
@Override
public MyObject apply(String uidKey) {
MyObject dataObject = interner.get(uidKey);
if (dataObject == null) {
dataObject = getFromDataBase(uidKey);
interner.put(uidKey, dataObject);
}
return dataObject;
} …
Run Code Online (Sandbox Code Playgroud) 在Java中制作规范形式的XML文件最简单的方法是什么?你有完成的代码吗?我在网上找到了几个链接,比如这个,这个,这个,但我不能让它起作用:/
谢谢,
伊万
编辑:我使用了那里提出的规范化,但我得到了奇怪的结果.为了更加精确,这个方法不会删除元素之间的空格......这就是我得到的:
<Metric xmlns="http://www.ibm.com/wsla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="total_memory_consumption_metric" type="double" unit="Mbit" xsi:schemaLocation="http://www.ibm.com/wsla WSLA.xsd"> <Source>ServiceProvider</Source> <MeasurementDirective resultType="double" xsi:type="StatusRequest"> <RequestURI> ***unused*** </RequestURI> </MeasurementDirective> </Metric>
Run Code Online (Sandbox Code Playgroud) 我有一个15M(百万)DAG(有向无环图 - 实际上是指向超立方体)的集合,我想从中删除同构.这个的常见算法是什么?每个图都相当小,一个维数为N的混合立方体,其中N为3到6(现在),得到64个节点的图,每个节点为N = 6的情况.
使用networkx和python,我实现了它,这适用于300k(千)的小集合就好(几天后运行).
def isIsomorphicDuplicate(hcL, hc):
"""checks if hc is an isomorphism of any of the hc's in hcL
Returns True if hcL contains an isomorphism of hc
Returns False if it is not found"""
#for each cube in hcL, check if hc could be isomorphic
#if it could be isomorphic, then check if it is
#if it is isomorphic, then return True
#if all comparisons have been made already, then it is not an isomorphism and …
Run Code Online (Sandbox Code Playgroud) 在C#中散列XML文档的最佳方法是什么?我想散列一个XML文档,以便我可以判断它是否从生成时手动更改.我没有使用它来保证安全性 - 如果有人更改XML并更改哈希值以匹配,则可以.
例如,我会对根的子节点进行哈希并将哈希存储为根的属性:
<RootNode Hash="abc123">
<!-- Content to hash here -->
</RootNode>
Run Code Online (Sandbox Code Playgroud) 我目前正在编写自己的小ORM,并发现自己面临着创建规范化映射的任务,以防止从数据库中多次加载同一个实体.
我目前的做法是使用a HashMap<Object, WeakReference<Object>>
.密钥是映射的数据库实体的主键(ArrayList<Object>
如果它是复合键),则值为WeakReference<Object>
.
我的主要问题是如何清理地图?当一个对象不再使用时,地图中的弱引用将会出现null
,我只会在下一次查找时发现这一点(或者,如果我不再查看该对象,则永远不会发现).ReferenceQueue
当它们被清除时,我可以使弱引用注册为a ,然后每次查看时检查该队列.清除的引用不会给我任何关于哪个对象被清除的提示,所以我想我必须子类WeakReference
将该键存储在地图中,所以我可以在清除引用后将其删除.
这是要走的路,还是有更简单的方法来实现它?
realpath
做我需要的,但只有在路径中的文件确实存在时才有效.
无论目录/文件是否实际存在,我都需要一个从字符串(例如../some/./directory/a/b/c/../d
到some/directory/a/b/d
)返回规范化路径的函数
基本上相当于PathCanonicalize
在Windows上.
这样的功能是否已经存在?
我在google上搜索了规范表示的含义,并发现了完全过于神秘的文档.任何人都可以快速解释规范表示,以及网站中规范表示攻击的典型漏洞是什么?
将BigDecimal
包含任意值的Java简化为规范形式的最简单方法是什么,以便BigDecimal
使用该equals()
方法将两个代表相同数字的数字相等?
我使用这样的代码从任意字符串解析我的数字:
BigDecimal x = new BigDecimal(string1, MathContext.DECIMAL64);
BigDecimal y = new BigDecimal(string2, MathContext.DECIMAL64);
Run Code Online (Sandbox Code Playgroud)
由于(string1
,string2
)是任意的,它们可以是,例如,("1"
,"1.0000"
)或("-32.5"
,"1981"
)......
我正在寻找的是该方法的最简单(最短/最干净的代码)实现规范化,以上断言
assert x.compareTo(y) != 0 ||
(canonicalize(x).equals(canonicalize(y)) &&
x.compareTo(canonicalize(x)) == 0 && y.compareTo(canonicalize(y)) == 0);
Run Code Online (Sandbox Code Playgroud)
将会成功...:
public static BigDecimal canonicalize(BigDecimal b) {
// TODO:
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解 Nauty 算法。遵循这篇文章:http://www.math.unl.edu/~aradcliffe1/Papers/Canonical.pdf
在该算法中,根据顶点的度数以及一个组与其他组相对应的相对度数(组动作)来区分顶点。通过这种方式,我们得到的组为:
1379|2468|5
完成此步骤后,将按照本文第 7 页中所述完成拆分。本文中的一张图片是:
我无法理解分裂是如何进行的,
1379|2468|5
为什么会分到不同的组,然后又1|9|37|68|24|5
分到另一个组。1
9
37
canonicalization ×10
java ×4
isomorphism ×2
xml ×2
algorithm ×1
bigdecimal ×1
c ×1
c# ×1
caching ×1
cryptography ×1
equals ×1
graph ×1
graph-theory ×1
guava ×1
hash ×1
json ×1
math ×1
orm ×1
realpath ×1