2014-10-20 3 views
0

У меня есть упорядоченный набор точек (x, y пар), которые я хотел бы использовать в качестве ключа в словаре.String SHA1 in Julia

Мой первоначальный подход в рубине состоял в том, чтобы получить строковое представление точек, а затем SHA1.

Что было бы лучшим способом добиться этого в Джулии?

Edit:

Ключ, который я хочу создать это множество точек, а не отдельные точки в наборе.

У меня есть процесс, который создает набор уникальных целых точек, и я хочу увидеть, встречался ли я с этим конкретным набором точек раньше. Я также хочу сохранить некоторую информацию об этом конкретном наборе точек. Например, сколько раз я видел эту конфигурацию.

Длина набора точек варьируется от 20 до 180 символов.

С символом SHA1 строкового представления этих точек я знаю, что мой ключ будет длиной до 40 символов, независимо от длины точек.

Фактически я использую SHA1 для сжатия моего ключа, чтобы размер моего словаря был как можно меньше. Я бы хотел, чтобы этот словарь вырос до довольно больших размеров.

+0

Почему бы не использовать пары x, y в качестве ключей? – rickhg12hs

+0

Я отредактировал оригинальный комментарий, чтобы сделать его немного понятнее. Я хочу использовать набор уникальных упорядоченных пар в качестве ключа в словаре. – koozdra

ответ

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 

EDIT: Вопрос просит о списки точек, а не отдельные пары. Его трудно сказать, из вашего вопроса, но если вы хотите, чтобы выбросить из списков точек, то я бы просто использовать функцию 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 

Это (с использованием изменяемых ключей) прекрасно подходит в Джулии (хотя плохие вещи произойдут, если вы измените ключи словаря, как только они будут добавлены, конечно).

+0

Я отредактировал оригинальный комментарий, чтобы быть более ясным. Я хотел бы использовать набор упорядоченных пар как ключ, а не сами упорядоченные пары. – koozdra

+0

Спасибо. Хэш-функция - именно то, что я искал. – koozdra