Это хеш-функция? питон - PullRequest
       11

Это хеш-функция? питон

3 голосов
/ 01 декабря 2011

я пытаюсь реализовать хэш-функцию в Python.Считаете ли вы следующую реальную хеш-функцию?У меня есть 10 блоков и значения от 1 до 7. Он также будет подсчитывать количество столкновений:)

import random

A=[1,2,3,4,5,6,7]
hashed=[]

def func():
     i=0
     count=0
     while len(A)>i:
          m=random.randint(1,10) # 10 buckets
          if m in hashed:
             count+=1
          hashed.append(m)
          print "element:",A[i], "hashed to bucket", m
          i+=1


     print "Amount of collisions:", count  


func()

Тест:

element: 1 hashed to bucket 3
element: 2 hashed to bucket 2
element: 3 hashed to bucket 10
element: 4 hashed to bucket 8
element: 5 hashed to bucket 3
element: 6 hashed to bucket 10
element: 7 hashed to bucket 4
Amount of collisions: 2

РЕДАКТИРОВАТЬ:

Iпросмотрел все комментарии и попытался создать еще одну хэш-функцию.На этот раз я использую random, чтобы определить ключи, которые должны быть хешированы.На этот раз у меня есть только 3 ведра.Я попробую с 25 значениями от 1 до 10:

import random


count=[]

list1 = []  # bucket 1
list2 = []  # bucket 2
list3 = []   # bucket 3

the_list = []
the_list.append(list1)
the_list.append(list2)
the_list.append(list3) # using lists within a list


def func():
   while True:
       number=random.randint(1,10)
       i=random.randint(0,len(the_list)-1)
       the_list[i].append(number)
       count.append(number)
       if len(count)>25: # testing for 25 values
           break

func()
print "Bucket 1:", the_list[0]
print "Bucket 2:", the_list[1]
print "Bucket 3:", the_list[2]

Тест:

Bucket 1: [5, 9, 8, 10, 3, 10]
Bucket 2: [10, 5, 8, 5, 6, 2, 6, 1, 8]
Bucket 3: [9, 4, 7, 2, 1, 6, 7, 10, 9, 1, 5]

Ответы [ 5 ]

4 голосов
/ 01 декабря 2011

Нет. Хеш-функция должна быть детерминированной.Он не может полагаться на случайность.

Хеш-процедура должна быть детерминированной - это означает, что для заданного входного значения она всегда должна генерировать одно и то же хеш-значение.Другими словами, это должна быть функция хешированных данных в математическом смысле этого слова.Это требование исключает хеш-функции, которые зависят от параметров внешних переменных, таких как генераторы псевдослучайных чисел или время суток.Он также исключает функции, которые зависят от адреса памяти хешируемого объекта, поскольку этот адрес может измениться во время выполнения (как это может случиться в системах, использующих определенные методы сбора мусора), хотя иногда перефразирование элемента возможно)

Источник: Хеш-функция - Детерминизм (Википедия)

1 голос
/ 01 декабря 2011

Нет, это не хэш-функция.Хэш-функция с учетом входных данных должна выдавать один и тот же вывод снова и снова.

Вместо создания своей собственной хеш-функции, почему бы не использовать hash в самом Python.Python имеет встроенную хэш-реализацию.

>>> hash("xyz")
-5999452984703080694

Таким образом, вместо использования list используйте dict с hash, ключом которого будет этот хэш-вывод.Сговоры можно легко обнаружить.

0 голосов
/ 01 декабря 2011

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

0 голосов
/ 01 декабря 2011

Нет. Вы вообще не выполняете никакого хэширования, просто случайным образом вставляете значения в массив. Хеш-функция принимает входные данные и возвращает детерминированное значение. Это возвращаемое значение - хеш.

0 голосов
/ 01 декабря 2011

Хеш-функция должна выдавать один и тот же вывод для того же самого входа ... ваша просто дает случайное число.Так что я не думаю, что это настоящая хеш-функция, нет.

...