1

可変長文字列に対する hash() 操作を含むプログラムの実行時から、異なる長さの文字列に対する hash() 関数の操作には一定の時間がかかる可能性があると感じました。私の仮定を検証するために、次の戦略を立てました-

  • 長さ k の文字列を作成する
  • 文字列をハッシュし、hash() 操作時間 t を記録します
  • これは、0 から 100,00 まで変化する k に対して繰り返され、文字列の長さ k と時間 t のプロットが生成されます。

したがって、文字列を操作するときに hash() 関数が一定時間操作であるという私の推測が正しい場合、素人の言葉でなぜそうなのか説明していただけますか? ソースコードへの参照ではなく、概念的または理論的な説明が望ましいでしょう-文字の長さに関係なく、大きな文字列でも瞬時にハッシュを生成する方法について。

以下は、上記の戦略のコード実装です -

import random
import time
import pylab

def form_str(k, n):
    """
        Form k-length strings of arbitrary characters, n in number.
    """
    for i in range(n):
        random_str = ''
        for j in range(k):
            nextchar = random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz')
            random_str += nextchar
        yield random_str

def time_hash(k, n):
    """
        Find the total time to hash n strings of k length each.
    """
    
    total_time = 0.0
    for element in form_str(k, n):
        start_time = time.time()
        # Because hash() works almost instantaneously we repeat
        # it 100,000 times to get a non-zero run time.
        for i in range(100000):
            hash(element)
        end_time = time.time()
        total_time += (end_time - start_time)
    return round(total_time, 2)

# print(time_hash(100, 100))  

def plot_time():
    """
        Plots the time vs string length (k) over a range of k-values.
    """
    x_values, y_values = [], []
    for k in range(0, 100000, 5000):
        x_values.append(k)
        y_values.append(time_hash(k, 100))
    # print(y_values)
    pylab.figure(1)
    pylab.title('Hash_Time_Complexity')
    pylab.xlabel('Length of string')
    pylab.ylabel('Time taken to hash string (100 x 100000 times)')
    pylab.plot(x_values, y_values, 'r:', label = 'Hash time')
    pylab.show()

plot_time()
# From the plot it is clear that indifferent of the string length
# hashing takes the same time.

以下は、生成されたプロットです - ここに画像の説明を入力

4

1 に答える 1