Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?
Я бы использовал руководство, но предпочитаю числовое значение.
Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?
Я бы использовал руководство, но предпочитаю числовое значение.
Будет ли это надежным для использования в качестве идентификатора для хранилища данных (SQL Server)?
Нет. GUID — 128-битные, а хэш-коды — 32-битные. Поэтому обязательно происходят столкновения. Маловероятно, что вы когда-нибудь столкнетесь с ним, но нет гарантии, что вы никогда с ним не столкнетесь.
Что вам нужно для надежности, так это гарантия того, что вы никогда не столкнетесь с конфликтом. Если вы настаиваете на использовании Guid.NewGuid().GetHashCode()
, вам нужно добавить логику для обнаружения коллизий. У GUID есть преимущества (и недостатки), но без дополнительной информации я бы предложил использовать автоинкрементный столбец int
. Тем более, что вы говорите, что вам нужен числовой столбец, я бы склонялся к использованию IDENTITY
.
guid
с большей вероятностью представляет запись уникально, чем numeric value
.
Вместе с:
См. это: Первичный ключ Guid или Int?
Настоящий GUID должен быть уникальным. Когда вы уменьшаете это до int (через GetHashCode), вероятность его уникальности уменьшается.
Есть одна веская причина для использования GUID (уникальность), и этот код удаляет эту функцию GUID.
int
тоже уникальны, поэтому просто говорить то же самое о GUID недостаточно.
- person jason; 23.02.2010
Если вам нужно числовое значение, используйте столбец IDENTITY
. Если вам нужен GUID, используйте uniqueidentifier
. Просто как тот.
Не пытайтесь смешивать и сочетать. Не хэшируйте GUID, чтобы получить числовое значение. Это оставит вас со всеми недостатками столбца GUID (большие данные/индексы, разделение страниц) и сведет на нет большинство преимуществ (фактическая уникальность, поддержка репликации). Кроме того, вы не получаете никаких преимуществ, которые дает последовательный числовой идентификатор, таких как временное упорядочение и производительность индекса.
Я бы сказал, просто используйте GUID в качестве значения столбца. Тогда никаких вопросов.
Dim bom As New Dictionary(Of Long, Boolean)
Sub pageload() Handles Me.Load
For i = 0 To 500
Dim act As New Action(AddressOf collisionfind)
act.BeginInvoke(Nothing, Nothing)
Next
End Sub
Sub collisionfind()
For index = 1 To 50000000
Dim INTGUID = Guid.NewGuid.GetHashCode / 2 * Guid.NewGuid.GetHashCode / 2
bom.Add(INTGUID, Nothing)
Next
End Sub
Ну, я думаю, в конце концов, это почти так же хорошо.
Никаких столкновений :D.
50000000 циклов на 500 потоков — это довольно тяжело. Мне этого достаточно.
Это распространенный подход, и я сразу же назову одну вескую причину, по которой стоит пойти по этому пути. Вы можете сгенерировать GUID до того, как попадете в БД, чтобы вы могли выполнить, скажем, вставку асинхронно, и заранее знали, каким будет идентификатор.
Убедитесь, что тип данных вашего первичного ключа имеет тип UNIQUEIDENTIFIER
, и все готово.