Julia中的字符串SHA1

时间:2014-10-20 06:54:27

标签: julia

我有一组有序的点(x,y对)我想用作字典中的键。

我在ruby中的原始方法是获得点的字符串表示,然后是SHA1结果。

在朱莉娅实现这一目标的最佳途径是什么?

编辑:

我想要创建的关键是点集,而不是集合中的各个点。

我有一个创建一组唯一整数点的过程,我想看看之前是否遇到过这个特定的点集。我还想存储一些关于这一特定点的信息。例如,我看过多少次此配置。

这组点的长度在20到180ish之间变化。

使用这些点的字符串表示的SHA1哈希,我知道无论点的长度如何,我的密钥都将是40个字符。

实际上,我使用SHA1来压缩我的密钥以保持字典的大小尽可能小。我希望这本词典能够发展到相当大的规模。

1 个答案:

答案 0 :(得分:2)

你可以直接使用它们作为字典的键,例如

points = [(rand(),rand()) for i in 1:100]
a_dict = [p => rand(1:10000) for p in points]
@show points[1]
@show a_dict[points[1]]

产生

points[1] => (0.4374267407775083,0.32232663537074036)
a_dict[points[1]] => 4102

编辑:问题是询问点的列表而不是单对。很难从你的问题中看出来,但是如果你想丢掉点列表,那么我只使用hash函数,这是字典使用的函数:

julia> x = [(rand(),rand()) for i in 1:100];

julia> y = copy(x);

julia> z = [(rand(),rand()) for i in 1:100];

julia> hash(x)
0x2dd258e3af0ec93a

julia> hash(y)
0x2dd258e3af0ec93a

julia> hash(z)
0x6449b750e42e6bc6

julia> some_dict = [hash(x) => 1, hash(z) => 1]
Dict{Uint64,Int64} with 2 entries:
  0x6449b750e42e6bc6 => 1
  0x2dd258e3af0ec93a => 1

julia> if hash(y) in keys(some_dict)
         some_dict[hash(y)] += 1
       else
         some_dict[hash(y)] = 1
       end

julia> some_dict
Dict{Uint64,Int64} with 2 entries:
  0x6449b750e42e6bc6 => 1
  0x2dd258e3af0ec93a => 2

如果您确实需要检索点集的内容,这似乎很可能,那么您可以直接使用字符集作为键,即

julia> other_dict = [x=>1,z=>1]
Dict{Array{(Float64,Float64),1},Int64} with 2 entries:
  [(0.6453074757765922,0.0958215… => 1
  [(0.5283378708792779,0.8418390… => 1

julia> other_dict[y] += 1
2

julia> other_dict
Dict{Array{(Float64,Float64),1},Int64} with 2 entries:
  [(0.6453074757765922,0.0958215… => 1
  [(0.5283378708792779,0.8418390… => 2

这个(使用可变键)在Julia中完全没问题(虽然如果你在添加字典后更改字典会发生不好的事情,当然)。