2011-12-01 116 views
3

即時通訊嘗試在python中實現一個哈希函數。你會考慮以下一個真正的散列函數嗎?我從110桶和值7,它還將計算碰撞:)量這是一個哈希函數嗎? python

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 

編輯:

我看了所有的評論和試圖創建另一個散列函數。這次我使用隨機確定要被哈希的鍵。這次我只有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] 
+0

當你需要檢索元素時,你會如何確定元素的位置?你在那裏引入了randonmess,下一次你有'1'可以用「bucket 10」來代替,但是oops ......它真的在第3桶。 –

+0

@John:你的測試輸出不可能來從你發佈的代碼。 count對func()是本地的,並且在運行func之前打印碰撞計數。在這裏可以很容易地看到可能發生的情況,但總的來說,總是要確保發佈獨立的例子,這些例子在單獨運行時生成輸出。 – DSM

+0

是的,我忘了爲最後一次打印創建空間,打印語句在我的程序中的func裏面。雖然信息ty。 – John

回答

4

編號散列函數必須是確定性的。它不能依賴隨機性。

散列過程必須是確定性的 - 這意味着對於給定的輸入值,它必須始終生成相同的散列值。換句話說,從術語的數學意義上講,它必須是散列數據的函數。此要求不包括取決於外部變量參數的散列函數,例如僞隨機數生成器或一天中的時間。它還排除依賴於被哈希對象的內存地址的函數,因爲該地址在執行過程中可能會發生變化(可能會發生在使用某些垃圾收集方法的系統上),儘管有時可能會重新哈希該項目。

來源:Hash function - Determinism(維基百科)

+0

謝謝。我誤導了,你有什麼建議如何在Python中創建一個簡單的哈希函數? – John

+3

下面是一個簡單的散列函數來散列一個整數:f(x):return x%10 –

+0

@John:你的修改後的例子用整數隨機填充一些數組。沒有可能被散列的輸入。你需要什麼散列函數? – Dennis

0

散列函數需要給出相同的輸入相同的輸出...你只是給了一個隨機的數。所以,我不認爲它是一個真正的哈希函數,不。

0

號您還沒有做任何散列可言,簡單地隨機粘附值到一個數組。散列函數接受輸入並返回確定性值。該返回值是散列。

0

不,這不是一個哈希函數。散列函數將一個較大的數據集中的元素映射到一個較小的數據集。這只是隨機地將數字插入到列表中。

1

不,這不是一個哈希函數。給定一個輸入的哈希函數應該再一次給出相同的輸出結果&。

而不是構建自己的散列函數,爲什麼不在Python本身中使用hash。 Python具有內置的哈希實現。

>>> hash("xyz") 
-5999452984703080694 

因此,而不是使用list使用與hash一個dict與關鍵的是這個散列輸出。混淆可以很容易被發現。

+0

我會盡力,謝謝 – John